In this notebook we conduct exploratory factor analyses (EFAs) on the datasets for our studies of concepts of mental life, in which each participants judged the various mental capacities of a particular target entity. We analyze datasets for adults and children from each of our five field sites: the US, Ghana, Thailand, China, and Vanuatu.

This notebook contains the results presented in the main text, in which we use Pearson correlations with our three-point response scale (no = 0, kinda = 0.5, yes = 1); see supplemental analyses for a version of these analyses treating kinda = yes = 1 and using tetrachoric correlations.

Adults

Samples

  country   n
       US 127
    Ghana 150
 Thailand 150
    China 136
  Vanuatu 148
    Total 711

Scale use

Factor retention: parallel analysis

Exploratory factor analysis

Factor loadings

the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be used

Congruence

funs() is soft deprecated as of dplyr 0.8.0
Please use a list of either functions or lambdas: 

  # Simple named list: 
  list(mean = mean, median = median)

  # Auto named with `tibble::lst()`: 
  tibble::lst(mean, median)

  # Using lambdas
  list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
This warning is displayed once per session.

Bootstrapped congruence

Children

Samples

  country   n
       US 117
    Ghana 150
 Thailand 152
    China 131
  Vanuatu 143
    Total 693

Scale use

Factor retention: parallel analysis

Exploratory factor analysis

Factor loadings

the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be used

Congruence

See All samples, below.

Bootstrapped congruence

All samples

Congruence

the condition has length > 1 and only the first element will be usedVectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.the condition has length > 1 and only the first element will be usedVectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be used

Developmental comparisons

Column `country` joining character vector and factor, coercing into character vector

Column `country` joining character vector and factor, coercing into character vector

Column `country` joining character vector and factor, coercing into character vector

Column `country` joining character vector and factor, coercing into character vector

Column `country` joining character vector and factor, coercing into character vector

Column `country` joining character vector and factor, coercing into character vector

LS0tCnRpdGxlOiAiQ29uY2VwdHMgb2YgbWVudGFsIGxpZmUgYWNyb3NzIGN1bHR1cmVzOiBQcmltYXJ5IGFuYWx5c2lzIgphdXRob3JzOiAiV2Vpc21hbiwgTGVnYXJlLCAmIEx1aHJtYW5uIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQotLS0KCmBgYHtyIHNldHVwfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEYsIG1lc3NhZ2UgPSBGKQpgYGAKCkluIHRoaXMgbm90ZWJvb2sgd2UgY29uZHVjdCBleHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzZXMgKEVGQXMpIG9uIHRoZSBkYXRhc2V0cyBmb3Igb3VyIHN0dWRpZXMgb2YgY29uY2VwdHMgb2YgbWVudGFsIGxpZmUsIGluIHdoaWNoIGVhY2ggcGFydGljaXBhbnRzIGp1ZGdlZCB0aGUgdmFyaW91cyBtZW50YWwgY2FwYWNpdGllcyBvZiBhIHBhcnRpY3VsYXIgdGFyZ2V0IGVudGl0eS4gV2UgYW5hbHl6ZSBkYXRhc2V0cyBmb3IgYWR1bHRzIGFuZCBjaGlsZHJlbiBmcm9tIGVhY2ggb2Ygb3VyIGZpdmUgZmllbGQgc2l0ZXM6IHRoZSBVUywgR2hhbmEsIFRoYWlsYW5kLCBDaGluYSwgYW5kIFZhbnVhdHUuIAoKVGhpcyBub3RlYm9vayBjb250YWlucyB0aGUgcmVzdWx0cyBwcmVzZW50ZWQgaW4gdGhlIG1haW4gdGV4dCwgaW4gd2hpY2ggd2UgdXNlIFBlYXJzb24gY29ycmVsYXRpb25zIHdpdGggb3VyIHRocmVlLXBvaW50IHJlc3BvbnNlIHNjYWxlIChubyA9IDAsIGtpbmRhID0gMC41LCB5ZXMgPSAxKTsgc2VlIHN1cHBsZW1lbnRhbCBhbmFseXNlcyBmb3IgYSB2ZXJzaW9uIG9mIHRoZXNlIGFuYWx5c2VzIHRyZWF0aW5nIGtpbmRhID0geWVzID0gMSBhbmQgdXNpbmcgdGV0cmFjaG9yaWMgY29ycmVsYXRpb25zLgoKCmBgYHtyLCBlY2hvID0gRiwgbWVzc2FnZSA9IEZ9CnNvdXJjZSgiLi9zY3JpcHRzL2RlcGVuZGVuY2llcy5SIikKc291cmNlKCIuL3NjcmlwdHMvY3VzdG9tX2Z1bnMuUiIpCnNvdXJjZSgiLi9zY3JpcHRzL3Zhcl9yZWNvZGVfY29udHJhc3QuUiIpCmBgYAoKYGBge3IgZGF0YX0KIyByZWFkIGluIGRhdGEsIHNob3J0ZW4gImZlZWwgc2ljaywiIGFuZCBsaW1pdCB0byB1bml2ZXJzYWwgdGFyZ2V0cyBhbmQgcXVlc3Rpb25zOiBhZHVsdHMKZF91c19hZHVsdHMgPC0gcmVhZF9jc3YoIi4uL2RhdGEvZF91c19hZHVsdHMuY3N2IikgJT4lCiAgZmlsdGVyKHRhcmdldCAlaW4lIGxldmVsc190YXJnZXRfdW5pdiwgcXVlc3Rpb25fY2F0ID09ICJ1bml2ZXJzYWwiKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJcXCwgLiokIiwgIiBcXFsuLi5cXF0iLCBxdWVzdGlvbikpCmRfZ2hfYWR1bHRzIDwtIHJlYWRfY3N2KCIuLi9kYXRhL2RfZ2hfYWR1bHRzLmNzdiIpICU+JQogIGZpbHRlcih0YXJnZXQgJWluJSBsZXZlbHNfdGFyZ2V0X3VuaXYsIHF1ZXN0aW9uX2NhdCA9PSAidW5pdmVyc2FsIikgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uID0gZ3N1YigiXFwsIC4qJCIsICIgXFxbLi4uXFxdIiwgcXVlc3Rpb24pKQpkX3RoX2FkdWx0cyA8LSByZWFkX2NzdigiLi4vZGF0YS9kX3RoX2FkdWx0cy5jc3YiKSAlPiUKICBmaWx0ZXIodGFyZ2V0ICVpbiUgbGV2ZWxzX3RhcmdldF91bml2LCBxdWVzdGlvbl9jYXQgPT0gInVuaXZlcnNhbCIpICU+JQogIG11dGF0ZShxdWVzdGlvbiA9IGdzdWIoIlxcLCAuKiQiLCAiIFxcWy4uLlxcXSIsIHF1ZXN0aW9uKSkKZF9jaF9hZHVsdHMgPC0gcmVhZF9jc3YoIi4uL2RhdGEvZF9jaF9hZHVsdHMuY3N2IikgJT4lCiAgZmlsdGVyKHRhcmdldCAlaW4lIGxldmVsc190YXJnZXRfdW5pdiwgcXVlc3Rpb25fY2F0ID09ICJ1bml2ZXJzYWwiKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJcXCwgLiokIiwgIiBcXFsuLi5cXF0iLCBxdWVzdGlvbikpCmRfdnRfYWR1bHRzIDwtIHJlYWRfY3N2KCIuLi9kYXRhL2RfdnRfYWR1bHRzLmNzdiIpICU+JQogIGZpbHRlcih0YXJnZXQgJWluJSBsZXZlbHNfdGFyZ2V0X3VuaXYsIHF1ZXN0aW9uX2NhdCA9PSAidW5pdmVyc2FsIikgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uID0gZ3N1YigiXFwsIC4qJCIsICIgXFxbLi4uXFxdIiwgcXVlc3Rpb24pKQoKIyByZWFkIGluIGRhdGEsIHNob3J0ZW4gImZlZWwgc2ljaywiIGFuZCBsaW1pdCB0byB1bml2ZXJzYWwgdGFyZ2V0cyBhbmQgcXVlc3Rpb25zOiBjaGlsZHJlbgpkX3VzX2NoaWxkcmVuIDwtIHJlYWRfY3N2KCIuLi9kYXRhL2RfdXNfY2hpbGRyZW4uY3N2IikgJT4lCiAgZmlsdGVyKHRhcmdldCAlaW4lIGxldmVsc190YXJnZXRfdW5pdiwgcXVlc3Rpb25fY2F0ID09ICJ1bml2ZXJzYWwiKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJcXCwgLiokIiwgIiBcXFsuLi5cXF0iLCBxdWVzdGlvbikpCmRfZ2hfY2hpbGRyZW4gPC0gcmVhZF9jc3YoIi4uL2RhdGEvZF9naF9jaGlsZHJlbi5jc3YiKSAlPiUKICBmaWx0ZXIodGFyZ2V0ICVpbiUgbGV2ZWxzX3RhcmdldF91bml2LCBxdWVzdGlvbl9jYXQgPT0gInVuaXZlcnNhbCIpICU+JQogIG11dGF0ZShxdWVzdGlvbiA9IGdzdWIoIlxcLCAuKiQiLCAiIFxcWy4uLlxcXSIsIHF1ZXN0aW9uKSkKIyBkX2doX2VuZ19jaGlsZHJlbiA8LSByZWFkX2NzdigiLi4vZGF0YS9kX2doX2VuZ19jaGlsZHJlbi5jc3YiKSAlPiUKIyAgIGZpbHRlcih0YXJnZXQgJWluJSBsZXZlbHNfdGFyZ2V0X3VuaXYsIHF1ZXN0aW9uX2NhdCA9PSAidW5pdmVyc2FsIikgJT4lCiMgICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJcXCwgLiokIiwgIiBcXFsuLi5cXF0iLCBxdWVzdGlvbikpCmRfdGhfY2hpbGRyZW4gPC0gcmVhZF9jc3YoIi4uL2RhdGEvZF90aF9jaGlsZHJlbi5jc3YiKSAlPiUKICBmaWx0ZXIodGFyZ2V0ICVpbiUgbGV2ZWxzX3RhcmdldF91bml2LCBxdWVzdGlvbl9jYXQgPT0gInVuaXZlcnNhbCIpICU+JQogIG11dGF0ZShxdWVzdGlvbiA9IGdzdWIoIlxcLCAuKiQiLCAiIFxcWy4uLlxcXSIsIHF1ZXN0aW9uKSkKZF9jaF9jaGlsZHJlbiA8LSByZWFkX2NzdigiLi4vZGF0YS9kX2NoX2NoaWxkcmVuLmNzdiIpICU+JQogIGZpbHRlcih0YXJnZXQgJWluJSBsZXZlbHNfdGFyZ2V0X3VuaXYsIHF1ZXN0aW9uX2NhdCA9PSAidW5pdmVyc2FsIikgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uID0gZ3N1YigiXFwsIC4qJCIsICIgXFxbLi4uXFxdIiwgcXVlc3Rpb24pKQpkX3Z0X2NoaWxkcmVuIDwtIHJlYWRfY3N2KCIuLi9kYXRhL2RfdnRfY2hpbGRyZW4uY3N2IikgJT4lCiAgZmlsdGVyKHRhcmdldCAlaW4lIGxldmVsc190YXJnZXRfdW5pdiwgcXVlc3Rpb25fY2F0ID09ICJ1bml2ZXJzYWwiKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJcXCwgLiokIiwgIiBcXFsuLi5cXF0iLCBxdWVzdGlvbikpICU+JQogICMgZmlsdGVyIG91dCBwYXJ0aWNpcGFudHMgb3V0c2lkZSBvZiB0aGUgYWdlIHJhbmdlCiAgZmlsdGVyKChhZ2UgPj0gNiAmIGFnZSA8PSAxMikgfCBpcy5uYShhZ2UpKQpgYGAKCmBgYHtyIHdpZGV9CiMgbWFrZSB3aWRlLWZvcm0gZGF0YXNldHMgZm9yIEVGQTogYWR1bHRzCmRfdXNfYWR1bHRzX3cgPC0gd2lkZV9kZl9mdW4oZF91c19hZHVsdHMpCmRfZ2hfYWR1bHRzX3cgPC0gd2lkZV9kZl9mdW4oZF9naF9hZHVsdHMpCmRfdGhfYWR1bHRzX3cgPC0gd2lkZV9kZl9mdW4oZF90aF9hZHVsdHMpCmRfY2hfYWR1bHRzX3cgPC0gd2lkZV9kZl9mdW4oZF9jaF9hZHVsdHMpCmRfdnRfYWR1bHRzX3cgPC0gd2lkZV9kZl9mdW4oZF92dF9hZHVsdHMpCgojIG1ha2Ugd2lkZS1mb3JtIGRhdGFzZXRzIGZvciBFRkE6IGNoaWxkcmVuCmRfdXNfY2hpbGRyZW5fdyA8LSB3aWRlX2RmX2Z1bihkX3VzX2NoaWxkcmVuKQpkX2doX2NoaWxkcmVuX3cgPC0gd2lkZV9kZl9mdW4oZF9naF9jaGlsZHJlbikKIyBkX2doX2VuZ19jaGlsZHJlbl93IDwtIHdpZGVfZGZfZnVuKGRfZ2hfZW5nX2NoaWxkcmVuKQpkX3RoX2NoaWxkcmVuX3cgPC0gd2lkZV9kZl9mdW4oZF90aF9jaGlsZHJlbikKZF9jaF9jaGlsZHJlbl93IDwtIHdpZGVfZGZfZnVuKGRfY2hfY2hpbGRyZW4pCmRfdnRfY2hpbGRyZW5fdyA8LSB3aWRlX2RmX2Z1bihkX3Z0X2NoaWxkcmVuKQpgYGAKCgojIEFkdWx0cwoKIyMgU2FtcGxlcwoKYGBge3Igc2FtcGxlcyBhZHVsdHN9CmJpbmRfcm93cyhkX3VzX2FkdWx0cywgZF9naF9hZHVsdHMsIGRfdGhfYWR1bHRzLCBkX2NoX2FkdWx0cywgZF92dF9hZHVsdHMpICU+JQogIG11dGF0ZShjb3VudHJ5ID0gZmFjdG9yKGNvdW50cnksIGxldmVscyA9IGxldmVsc19jb3VudHJ5KSkgJT4lCiAgZGlzdGluY3QoY291bnRyeSwgc3Vial9pZCkgJT4lCiAgY291bnQoY291bnRyeSkgJT4lCiAgamFuaXRvcjo6YWRvcm5fdG90YWxzKCkKYGBgCgojIyBTY2FsZSB1c2UKCmBgYHtyIHNjYWxlIHVzZSBtZWFuIG92ZXJhbGwgYWR1bHRzfQpiaW5kX3Jvd3MoZF91c19hZHVsdHMsIGRfZ2hfYWR1bHRzLCBkX3RoX2FkdWx0cywgZF9jaF9hZHVsdHMsIGRfdnRfYWR1bHRzKSAlPiUKICBtdXRhdGUoY291bnRyeSA9IGZhY3Rvcihjb3VudHJ5LCBsZXZlbHMgPSBsZXZlbHNfY291bnRyeSksCiAgICAgICAgIHJlc3BvbnNlX2NhdCA9IHJlY29kZV9mYWN0b3IocmVzcG9uc2VfY2F0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJubyIgPSAibm8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJraW5kIG9mIiA9ICJraW5kIG9mIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieWVzIiA9ICJ5ZXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWlzc2luZyA9ICJtaXNzaW5nIGRhdGEiKSkgJT4lCiAgY291bnQoY291bnRyeSwgcmVzcG9uc2VfY2F0KSAlPiUKICBjb21wbGV0ZShyZXNwb25zZV9jYXQsIG5lc3RpbmcoY291bnRyeSksIGZpbGwgPSBsaXN0KG4gPSAwKSkgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgbXV0YXRlKHByb3AgPSBuL3N1bShuLCBuYS5ybSA9IFQpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgc2VsZWN0KC1uKSAlPiUKICBzcHJlYWQocmVzcG9uc2VfY2F0LCBwcm9wKSAlPiUKICBqYW5pdG9yOjphZG9ybl9wY3RfZm9ybWF0dGluZyhkaWdpdHMgPSAyKQpgYGAKCiMjIEZhY3RvciByZXRlbnRpb246IHBhcmFsbGVsIGFuYWx5c2lzCgpgYGB7ciBwYXJhbGxlbCBkaXN0IGFkdWx0cywgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDAuNX0KIyBOT1RFOiB0aGVyZSBhcHBlYXJzIHRvIGJlIHNvbWUgdW5yZWxpYWJpbGl0eS9ub24tcmVwcm9kdWNpYmlsaXR5IGluIHJlc3VsdHMsIGVzcGVjaWFsbHkgZm9yIHZ0IGFkdWx0cywgd2hpY2ggSSBkb24ndCB1bmRlcnN0YW5kIC0tIHNvIGhlcmUncyB0aGUgZGlzdHJpYnV0aW9uIG92ZXIgb3V0Y29tZXMgb2YgcGFyYWxsZWwgYW5hbHlzaXMgd2l0aCAxMDAgaXRlcmF0aW9ucy4gV2UnbGwgY2hvb3NlIHRoZSBtZWRpYW4gbnVtYmVyIG9mIGZhY3RvcnMuCgppZiAoZmlsZS5leGlzdHMoIi4uL3Jlc3VsdHMvcGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMuUkRTIikpIHsKICAKICBwYV9vdXRjb21lc19kaXN0X2FkdWx0cyA8LSByZWFkUkRTKCIuLi9yZXN1bHRzL3BhX291dGNvbWVzX2Rpc3RfYWR1bHRzLlJEUyIpCiAgCn0gZWxzZSB7CiAgCiAgcGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMgPC0gZGF0YS5mcmFtZSh1cyA9IE5VTEwsIGdoID0gTlVMTCwgdGggPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBOVUxMLCB2dCA9IE5VTEwpCiAgCiAgc2V0LnNlZWQoNTQzMjEpCiAgbl9jb3JlcyA8LSBwYXJhbGxlbDo6ZGV0ZWN0Q29yZXMoKQogIG9wdGlvbnMobWMuY29yZXMgPSBuX2NvcmVzKQogIAogIGZvciAoaSBpbiAxOjEwMCkgewogICAgcGFfb3V0Y29tZXNfZGlzdF9hZHVsdHNbaSwgInVzIl0gPC0gZmEucGFyYWxsZWwoZF91c19hZHVsdHNfdywgcGxvdCA9IEYpJG5mYWN0CiAgICBwYV9vdXRjb21lc19kaXN0X2FkdWx0c1tpLCAiZ2giXSA8LSBmYS5wYXJhbGxlbChkX2doX2FkdWx0c193LCBwbG90ID0gRikkbmZhY3QgICAgIAogICAgcGFfb3V0Y29tZXNfZGlzdF9hZHVsdHNbaSwgInRoIl0gPC0gZmEucGFyYWxsZWwoZF90aF9hZHVsdHNfdywgcGxvdCA9IEYpJG5mYWN0CiAgICBwYV9vdXRjb21lc19kaXN0X2FkdWx0c1tpLCAiY2giXSA8LSBmYS5wYXJhbGxlbChkX2NoX2FkdWx0c193LCBwbG90ID0gRikkbmZhY3QKICAgIHBhX291dGNvbWVzX2Rpc3RfYWR1bHRzW2ksICJ2dCJdIDwtIGZhLnBhcmFsbGVsKGRfdnRfYWR1bHRzX3csIHBsb3QgPSBGKSRuZmFjdAogIH0KICAKICBzYXZlUkRTKHBhX291dGNvbWVzX2Rpc3RfYWR1bHRzLCBmaWxlID0gIi4uL3Jlc3VsdHMvcGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMuUkRTIikKfQoKIyBwbG90CnBhX291dGNvbWVzX2Rpc3RfYWR1bHRzICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiaXRlciIpICU+JQogIGdhdGhlcihjb3VudHJ5LCBuZmFjdCwgLWl0ZXIpICU+JQogIG11dGF0ZShjb3VudHJ5ID0gZmFjdG9yKGNvdW50cnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygidXMiLCAiZ2giLCAidGgiLCAiY2giLCAidnQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBsZXZlbHNfY291bnRyeSkpICU+JQogIGdncGxvdChhZXMoeCA9IG5mYWN0KSkgKwogIGZhY2V0X2dyaWQofiBjb3VudHJ5KSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJjb3VudCIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygxLCBtYXgocGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMpICsgMSksCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcSgwLCAxMDAsIDEpKSArCiAgbGFicyh4ID0gIk51bWJlciBvZiBmYWN0b3JzIHN1Z2dlc3RlZCBieSBmYS5wYXJhbGxlbCgpIikKYGBgCgojIyBFeHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzaXMKCmBgYHtyIGVmYSBhZHVsdHN9CnNldC5zZWVkKDU0MzIxKQoKIyBkbyBleHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzaXM6IGFkdWx0cwplZmFfdXNfYWR1bHRzIDwtIGZhX2Z1bihkX3VzX2FkdWx0c193LCBuID0gbWVkaWFuKHBhX291dGNvbWVzX2Rpc3RfYWR1bHRzJHVzKSkKY29sbmFtZXMoZWZhX3VzX2FkdWx0cyRsb2FkaW5ncykgPC0gcGFzdGUwKCJ1c0FEVUxUU18iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV91c19hZHVsdHMkbG9hZGluZ3MpKQoKZWZhX2doX2FkdWx0cyA8LSBmYV9mdW4oZF9naF9hZHVsdHNfdywgbiA9IG1lZGlhbihwYV9vdXRjb21lc19kaXN0X2FkdWx0cyRnaCkpCmNvbG5hbWVzKGVmYV9naF9hZHVsdHMkbG9hZGluZ3MpIDwtIHBhc3RlMCgiZ2hBRFVMVFNfIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfZ2hfYWR1bHRzJGxvYWRpbmdzKSkKCmVmYV90aF9hZHVsdHMgPC0gZmFfZnVuKGRfdGhfYWR1bHRzX3csIG4gPSBtZWRpYW4ocGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMkdGgpKQpjb2xuYW1lcyhlZmFfdGhfYWR1bHRzJGxvYWRpbmdzKSA8LSBwYXN0ZTAoInRoQURVTFRTXyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX3RoX2FkdWx0cyRsb2FkaW5ncykpCgplZmFfY2hfYWR1bHRzIDwtIGZhX2Z1bihkX2NoX2FkdWx0c193LCBuID0gbWVkaWFuKHBhX291dGNvbWVzX2Rpc3RfYWR1bHRzJGNoKSkKY29sbmFtZXMoZWZhX2NoX2FkdWx0cyRsb2FkaW5ncykgPC0gcGFzdGUwKCJjaEFEVUxUU18iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV9jaF9hZHVsdHMkbG9hZGluZ3MpKQoKZWZhX3Z0X2FkdWx0cyA8LSBmYV9mdW4oZF92dF9hZHVsdHNfdywgbiA9IG1lZGlhbihwYV9vdXRjb21lc19kaXN0X2FkdWx0cyR2dCkpCmNvbG5hbWVzKGVmYV92dF9hZHVsdHMkbG9hZGluZ3MpIDwtIHBhc3RlMCgidnRBRFVMVFNfIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfdnRfYWR1bHRzJGxvYWRpbmdzKSkKYGBgCgpgYGB7ciBmYWN0b3IgbmFtZXMgYWR1bHRzfQpmYWN0b3JfbmFtZXNfYWR1bHRzIDwtIGRhdGEuZnJhbWUoZmFjdG9yID0gYyhjb2xuYW1lcyhlZmFfdXNfYWR1bHRzJGxvYWRpbmdzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX2doX2FkdWx0cyRsb2FkaW5ncyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV90aF9hZHVsdHMkbG9hZGluZ3MpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfY2hfYWR1bHRzJGxvYWRpbmdzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX3Z0X2FkdWx0cyRsb2FkaW5ncykpKSAlPiUKICBtdXRhdGUoYWdlX2dyb3VwID0gImFkdWx0cyIpICU+JQogIG11dGF0ZShjb3VudHJ5ID0gY2FzZV93aGVuKGdyZXBsKCJedXMiLCBmYWN0b3IpIH4gIlVTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiXmdoIiwgZmFjdG9yKSB+ICJHaGFuYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoIl50aCIsIGZhY3RvcikgfiAiVGhhaWxhbmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJeY2giLCBmYWN0b3IpIH4gIkNoaW5hIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiXnZ0IiwgZmFjdG9yKSB+ICJWYW51YXR1IiksCiAgICAgICAgIGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwgbGV2ZWxzX2NvdW50cnkpKSAlPiUKICBtdXRhdGUoZmFjdG9yX25hbWUgPSBnc3ViKCJedXMiLCAiVVMgIiwgZmFjdG9yKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJeZ2giLCAiR2guICIsIGZhY3Rvcl9uYW1lKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJedGgiLCAiVGguICIsIGZhY3Rvcl9uYW1lKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJeY2giLCAiQ2guICIsIGZhY3Rvcl9uYW1lKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJednQiLCAiVmEuICIsIGZhY3Rvcl9uYW1lKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJBRFVMVFMiLCAiYWR1bHRzIiwgZmFjdG9yX25hbWUpLAogICAgICAgICBmYWN0b3JfbmFtZSA9IGdzdWIoIl9GIiwgIiBGYWN0b3IgIiwgZmFjdG9yX25hbWUpKSAlPiUKICBtdXRhdGUoZmFjdG9yX2Rlc2NyaXB0ID0gcmVjb2RlKGZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzQURVTFRTX0YxID0gIkJvZHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNBRFVMVFNfRjIgPSAiSGVhcnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNBRFVMVFNfRjMgPSAiTWluZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaEFEVUxUU19GMSA9ICJJbm5lciBzcGhlcmUgKG1pbmQtbGlrZSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2hBRFVMVFNfRjIgPSAiQm9keS1saWtlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdoQURVTFRTX0YzID0gIkludGVycGVyc29uYWwsIHJlbGlnaW91cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aEFEVUxUU19GMSA9ICJCb2R5LWxpa2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhBRFVMVFNfRjIgPSAiSGVhcnQtbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aEFEVUxUU19GMyA9ICJNaW5kLWxpa2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hBRFVMVFNfRjEgPSAiQm9keS1saWtlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQURVTFRTX0YyID0gIkhlYXJ0LWxpa2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hBRFVMVFNfRjMgPSAiTWluZC1saWtlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0QURVTFRTX0YxID0gIkhhcm1vbnkgKG1pbmQtbGlrZSwgaGVhcnQtbGlrZSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnRBRFVMVFNfRjIgPSAiU2luIChib2R5LWxpa2UpIiksCiAgICAgICAgIGZhY3Rvcl9sYWJkZXNjcmlwdCA9IHBhc3RlKGdzdWIoIi4qX0YiLCAiRiIsIGZhY3RvciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9kZXNjcmlwdCwgc2VwID0gIjogIikpCmBgYAoKIyMgRmFjdG9yIGxvYWRpbmdzCgpgYGB7ciBvcmRlciBhZHVsdHN9CiMgb3JkZXIgY2FwYWNpdGllczogYWR1bHRzCm9yZGVyX3VzX2FkdWx0cyA8LSBmYS5zb3J0KGVmYV91c19hZHVsdHMpJGxvYWRpbmdzW10gJT4lIHJvd25hbWVzKCkKb3JkZXJfZ2hfYWR1bHRzIDwtIGZhLnNvcnQoZWZhX2doX2FkdWx0cykkbG9hZGluZ3NbXSAlPiUgcm93bmFtZXMoKQpvcmRlcl90aF9hZHVsdHMgPC0gZmEuc29ydChlZmFfdGhfYWR1bHRzKSRsb2FkaW5nc1tdICU+JSByb3duYW1lcygpCm9yZGVyX2NoX2FkdWx0cyA8LSBmYS5zb3J0KGVmYV9jaF9hZHVsdHMpJGxvYWRpbmdzW10gJT4lIHJvd25hbWVzKCkKb3JkZXJfdnRfYWR1bHRzIDwtIGZhLnNvcnQoZWZhX3Z0X2FkdWx0cykkbG9hZGluZ3NbXSAlPiUgcm93bmFtZXMoKQpgYGAKCmBgYHtyIGxvYWRpbmdzIGFkdWx0c30KIyBjb21waWxlIGxvYWRpbmdzOiBhZHVsdHMKbG9hZGluZ3NfYWR1bHRzIDwtIGJpbmRfcm93cygKICBsb2FkaW5nc19mdW4oZWZhX3VzX2FkdWx0cykgJT4lIG11dGF0ZShjb3VudHJ5ID0gIlVTIiksCiAgbG9hZGluZ3NfZnVuKGVmYV9naF9hZHVsdHMpICU+JSBtdXRhdGUoY291bnRyeSA9ICJHaGFuYSIpLAogIGxvYWRpbmdzX2Z1bihlZmFfdGhfYWR1bHRzKSAlPiUgbXV0YXRlKGNvdW50cnkgPSAiVGhhaWxhbmQiKSwKICBsb2FkaW5nc19mdW4oZWZhX2NoX2FkdWx0cykgJT4lIG11dGF0ZShjb3VudHJ5ID0gIkNoaW5hIiksCiAgbG9hZGluZ3NfZnVuKGVmYV92dF9hZHVsdHMpICU+JSBtdXRhdGUoY291bnRyeSA9ICJWYW51YXR1IikpICU+JQogIG11dGF0ZShjb3VudHJ5ID0gZmFjdG9yKGNvdW50cnksIGxldmVscyA9IGxldmVsc19jb3VudHJ5KSwKICAgICAgICAgY2FwYWNpdHlfb3JkX3VzID0gZmFjdG9yKGNhcGFjaXR5LCBsZXZlbHMgPSBvcmRlcl91c19hZHVsdHMpLAogICAgICAgICBjYXBhY2l0eV9vcmRfZ2ggPSBmYWN0b3IoY2FwYWNpdHksIGxldmVscyA9IG9yZGVyX2doX2FkdWx0cyksCiAgICAgICAgIGNhcGFjaXR5X29yZF90aCA9IGZhY3RvcihjYXBhY2l0eSwgbGV2ZWxzID0gb3JkZXJfdGhfYWR1bHRzKSwKICAgICAgICAgY2FwYWNpdHlfb3JkX2NoID0gZmFjdG9yKGNhcGFjaXR5LCBsZXZlbHMgPSBvcmRlcl9jaF9hZHVsdHMpLAogICAgICAgICBjYXBhY2l0eV9vcmRfdnQgPSBmYWN0b3IoY2FwYWNpdHksIGxldmVscyA9IG9yZGVyX3Z0X2FkdWx0cykpICU+JQogIGFycmFuZ2UoY291bnRyeSwgZmFjdG9yLCBkZXNjKGFicyhsb2FkaW5nKSksIGNhcGFjaXR5KSAlPiUKICBtdXRhdGUob3JkZXIgPSAxOm5yb3coLikpICU+JQogIGxlZnRfam9pbihmYWN0b3JfbmFtZXNfYWR1bHRzKQpgYGAKCmBgYHtyIGhlYXRtYXBzIGJ5IHNpdGUgYWR1bHRzLCBmaWcud2lkdGggPSAxNSwgZmlnLmFzcCA9IDAuMjV9CnBsb3RfZ3JpZChoZWF0bWFwX2Z1bihlZmFfdXNfYWR1bHRzLCAKICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihjb3VudHJ5ID09ICJVUyIpICU+JQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoZmFjdG9yX2xhYmRlc2NyaXB0KSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KCkpICsgCiAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgICAgICAgICBsYWJzKHRpdGxlID0gIlVTOiBhZHVsdHMiKSwKICAgICAgICAgIGhlYXRtYXBfZnVuKGVmYV9naF9hZHVsdHMsCiAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfYWR1bHRzICU+JQogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoY291bnRyeSA9PSAiR2hhbmEiKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KGZhY3Rvcl9sYWJkZXNjcmlwdCkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdCgpKSArIAogICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICAgICAgICAgICAgbGFicyh0aXRsZSA9ICJHSEFOQTogYWR1bHRzIiksCiAgICAgICAgICBoZWF0bWFwX2Z1bihlZmFfdGhfYWR1bHRzLAogICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gZmFjdG9yX25hbWVzX2FkdWx0cyAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGNvdW50cnkgPT0gIlRoYWlsYW5kIikgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChmYWN0b3JfbGFiZGVzY3JpcHQpICU+JQogICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QoKSkgKyAKICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICAgICAgICAgIGxhYnModGl0bGUgPSAiVEhBSUxBTkQ6IGFkdWx0cyIpLAogICAgICAgICAgaGVhdG1hcF9mdW4oZWZhX2NoX2FkdWx0cywKICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihjb3VudHJ5ID09ICJDaGluYSIpICU+JQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoZmFjdG9yX2xhYmRlc2NyaXB0KSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KCkpICsgCiAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgICAgICAgICBsYWJzKHRpdGxlID0gIkNISU5BOiBhZHVsdHMiKSwKICAgICAgICAgIGhlYXRtYXBfZnVuKGVmYV92dF9hZHVsdHMsCiAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfYWR1bHRzICU+JQogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoY291bnRyeSA9PSAiVmFudWF0dSIpICU+JQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoZmFjdG9yX2xhYmRlc2NyaXB0KSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KCkpICsgCiAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgICAgICAgICBsYWJzKHRpdGxlID0gIlZBTlVBVFU6IGFkdWx0cyIpLAogICAgICAgICAgbmNvbCA9IDUpCmBgYAoKYGBge3IgaGVhdG1hcCBhZHVsdHMsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjd9CiMgbWFrZSBoZWF0bWFwIGZpZ3VyZTogYWR1bHRzCmxvYWRpbmdzX2FkdWx0cyAlPiUKICBtdXRhdGUoZmFjdG9yX251bSA9IGFzLm51bWVyaWMoZ3N1YigiLipGIiwgIiIsIGZhY3RvcikpKSAlPiUKICBtdXRhdGUoc2FtcGxlID0gcGFzdGUoY291bnRyeSwgImFkdWx0cyIsIHNlcCA9ICJcbiIpKSAlPiUKICBsZWZ0X2pvaW4oZmFjdG9yX25hbWVzX2FkdWx0cykgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwgbGV2ZWxzID0gbGV2ZWxzX2NvdW50cnkpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKGZhY3Rvcl9sYWJkZXNjcmlwdCwgZmFjdG9yX251bSksIAogICAgICAgICAgICAgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2MoY2FwYWNpdHlfb3JkX3VzKSksCiAgICAgICAgICAgICAjIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKGNhcGFjaXR5X29yZF9lYykpLCAKICAgICAgICAgICAgICMgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2MoY2FwYWNpdHlfb3JkX2doKSksCiAgICAgICAgICAgICAjIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKGNhcGFjaXR5X29yZF90aCkpLAogICAgICAgICAgICAgIyB5ID0gcmVvcmRlcihjYXBhY2l0eSwgZGVzYyhjYXBhY2l0eV9vcmRfY2gpKSwKICAgICAgICAgICAgICMgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2MoY2FwYWNpdHlfb3JkX3Z0KSksCiAgICAgICAgICAgICBmaWxsID0gbG9hZGluZykpICsKICBmYWNldF9ncmlkKH4gcmVvcmRlcihzYW1wbGUsIGFzLm51bWVyaWMoY291bnRyeSkpLCBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuMikgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBmb3JtYXQocm91bmQobG9hZGluZywgMiksIG5zbWFsbCA9IDIpKSwgc2l6ZSA9IDMpICsKICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIlJkWWxCdSIsIGxpbWl0cyA9IGMoLTEsIDEpLAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoYmFyaGVpZ2h0ID0gMjAsIGJhcndpZHRoID0gMC41KSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgIHBhbmVsLnNwYWNpbmcueCA9IHVuaXQoMC44LCAibGluZXMiKSwKICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBmYWNlID0gImJvbGQiKSkgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSAiQ2FwYWNpdHkiLCBmaWxsID0gIkZhY3RvclxubG9hZGluZyIpCmBgYAoKIyMgQ29uZ3J1ZW5jZQoKYGBge3IgY29uZ3J1ZW5jZSBhZHVsdHN9CmNvbmdfYWR1bHRzIDwtIGZhLmNvbmdydWVuY2UoeCA9IGxpc3QoZWZhX3VzX2FkdWx0cyRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfZ2hfYWR1bHRzJGxvYWRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV90aF9hZHVsdHMkbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhX2NoX2FkdWx0cyRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfdnRfYWR1bHRzJGxvYWRpbmdzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSA1KSAlPiUKICAjIGdldF91cHBlcl90cmlfZnVuKCkgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiZmFjdG9yX0EiKSAlPiUKICBnYXRoZXIoZmFjdG9yX0IsIGNvbmcsIC1mYWN0b3JfQSkgJT4lCiAgbGVmdF9qb2luKGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lIAogICAgICAgICAgICAgIHJlbmFtZV9hbGwobGlzdCh+IChwYXN0ZSguLCAiQSIsIHNlcCA9ICJfIikpKSkpICU+JQogIGxlZnRfam9pbihmYWN0b3JfbmFtZXNfYWR1bHRzICU+JSAKICAgICAgICAgICAgICByZW5hbWVfYWxsKGxpc3QofiAocGFzdGUoLiwgIkIiLCBzZXAgPSAiXyIpKSkpKQpgYGAKCmBgYHtyIHRvcCBtYXRjaCBhZHVsdHN9CmNvbmdfYWR1bHRzX3RvcF9tYXRjaF9BIDwtIHRvcF9tYXRjaF9mdW4oY29uZ19hZHVsdHMsICJjb3VudHJ5X0EiKQpjb25nX2FkdWx0c190b3BfbWF0Y2hfQiA8LSB0b3BfbWF0Y2hfZnVuKGNvbmdfYWR1bHRzLCAiY291bnRyeV9CIikKYGBgCgpgYGB7ciBjb25nIGFsbCBwYWlycyBhZHVsdHMsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjd9CmNvbmdfYWR1bHRzICU+JQogIG11dGF0ZV9hdCgjdmFycyhjb250YWlucygibGFiZGVzY3JpcHQiKSksCiAgICB2YXJzKGZhY3Rvcl9sYWJkZXNjcmlwdF9BKSwKICAgIGZ1bnMoZ3N1YigiIFxcKCIsICJcblxcKCIsIC4pKSkgJT4lCiAgbXV0YXRlX2F0KCN2YXJzKGNvbnRhaW5zKCJsYWJkZXNjcmlwdCIpKSwKICAgIHZhcnMoZmFjdG9yX2xhYmRlc2NyaXB0X0EpLAogICAgZnVucyhnc3ViKCJcXC8iLCAiXFwvXG4iLCAuKSkpICU+JQogICMgbGVmdF9qb2luKGNvbmdfYWR1bHRzX3RvcF9tYXRjaF9BICU+JSByZW5hbWUodG9wX21hdGNoX0EgPSB0b3BfbWF0Y2gpKSAlPiUKICBsZWZ0X2pvaW4oY29uZ19hZHVsdHNfdG9wX21hdGNoX0IgJT4lIHJlbmFtZSh0b3BfbWF0Y2hfQiA9IHRvcF9tYXRjaCkpICU+JQogIG11dGF0ZShpc190b3BfbWF0Y2ggPSBjYXNlX3doZW4oZmFjdG9yX0EgPT0gZmFjdG9yX0IgfiAiYm9sZC5pdGFsaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmYWN0b3JfQSA9PSB0b3BfbWF0Y2hfQSB+ICJib2xkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9CID09IHRvcF9tYXRjaF9CIH4gImJvbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJwbGFpbiIpKSAlPiUKICAjIG11dGF0ZShjb25nID0gaWZlbHNlKGNvbmcgPT0gMSwgTkFfcmVhbF8sIGNvbmcpKSAlPiUKICBtdXRhdGUoc2FtcGxlX0EgPSBwYXN0ZSh0b3VwcGVyKGNvdW50cnlfQSksICJhZHVsdHMiLCBzZXAgPSAiOlxuIikpICU+JQogIG11dGF0ZShzYW1wbGVfQiA9IHBhc3RlKHRvdXBwZXIoY291bnRyeV9CKSwgImFkdWx0cyIsIHNlcCA9ICI6XG4iKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoY291bnRyeV9BLCBjb3VudHJ5X0IpLAogICAgICAgICAgICBmdW5zKGZhY3Rvcih0b3VwcGVyKC4pLCBsZXZlbHMgPSB0b3VwcGVyKGxldmVsc19jb3VudHJ5KSkpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBmYWN0b3JfbGFiZGVzY3JpcHRfQSwKICAgICAgICAgICAgIHkgPSByZW9yZGVyKGZhY3Rvcl9sYWJkZXNjcmlwdF9CLCBkZXNjKGZhY3Rvcl9sYWJkZXNjcmlwdF9CKSksCiAgICAgICAgICAgICBmaWxsID0gY29uZykpICsKICBmYWNldF9ncmlkKHJlb3JkZXIoc2FtcGxlX0IsIGFzLm51bWVyaWMoY291bnRyeV9CKSkgfiAKICAgICAgICAgICAgICAgcmVvcmRlcihzYW1wbGVfQSwgYXMubnVtZXJpYyhjb3VudHJ5X0EpKSwgCiAgICAgICAgICAgICBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuMikgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjYXNlX3doZW4oaXMubmEoY29uZykgfiAiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBmb3JtYXQocm91bmQoY29uZywgMiksIG5zbWFsbCA9IDIpKSwKICAgICAgICAgICAgICAgIGZvbnRmYWNlID0gaXNfdG9wX21hdGNoLAogICAgICAgICAgICAgICAgY29sb3IgPSBpc190b3BfbWF0Y2gpLAogICAgICAgICAgICBzaXplID0gMywgc2hvdy5sZWdlbmQgPSBGKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImRhcmtyZWQiLCAiZGFya2JsdWUiLCAiYmxhY2siKSkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG9wdGlvbiA9ICJ2aXJpZGlzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihiYXJ3aWR0aCA9IDI1LCBiYXJoZWlnaHQgPSAwLjUpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGZhY2UgPSAiYm9sZCIpKSArCiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwsIGZpbGwgPSBleHByZXNzaW9uKGl0YWxpYyhyW2NdKSkpCmBgYAoKIyMgQm9vdHN0cmFwcGVkIGNvbmdydWVuY2UKCmBgYHtyIGJvb3RzdHJhcCBjb25ncnVlbmNlIGFkdWx0c30KaWYgKGZpbGUuZXhpc3RzKCIuLi9yZXN1bHRzL2NvbmdfZGZfYWR1bHRzLlJEUyIpKSB7CiAgCiAgY29uZ19kZl9hZHVsdHMgPC0gcmVhZFJEUygiLi4vcmVzdWx0cy9jb25nX2RmX2FkdWx0cy5SRFMiKQogIAp9IGVsc2UgewogIAogIGJzX2FkdWx0cyA8LSBsb2FkaW5nc19hZHVsdHMgJT4lCiAgICBzZWxlY3QoY2FwYWNpdHksIGZhY3RvciwgbG9hZGluZykgJT4lCiAgICBzcHJlYWQoZmFjdG9yLCBsb2FkaW5nKSAlPiUKICAgIHNlbGVjdCgtY2FwYWNpdHkpICU+JQogICAgc2pzdGF0czo6Ym9vdHN0cmFwKDEwMDApIAogIAogIGZhY3RvcnMgPC0gbGV2ZWxzKGZhY3Rvcihsb2FkaW5nc19hZHVsdHMkZmFjdG9yKSkKICAKICBjb25nX2RmX2FkdWx0cyA8LSBkYXRhLmZyYW1lKE5VTEwpCiAgZm9yIChpIGluIGZhY3RvcnMpIHsKICAgIGZvciAoaiBpbiBmYWN0b3JzKSB7CiAgICAgIGNuYW1lIDwtIHBhc3RlKGksIGosIHNlcCA9ICIuIikKICAgICAgdGVtcCA8LSBic19hZHVsdHMgJT4lCiAgICAgICAgbXV0YXRlKGNvbmcgPSBtYXBfZGJsKHN0cmFwLCB+bHNhOjpjb3NpbmUoYXMuZGF0YS5mcmFtZSgueClbLGldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5kYXRhLmZyYW1lKC54KVssal0pKSkKICAgICAgY29uZ19kZl9hZHVsdHNbMToxMDAwLCBjbmFtZV0gPC0gdGVtcCRjb25nCiAgICB9CiAgfQogIAogIGNvbmdfZGZfYWR1bHRzIDwtIGNvbmdfZGZfYWR1bHRzICU+JQogICAgZ2F0aGVyKGZhY3Rvcl9wYWlyLCBjb25nKSAlPiUKICAgIHNlcGFyYXRlKGZhY3Rvcl9wYWlyLCBpbnRvID0gYygiZmFjdG9yX0EiLCAiZmFjdG9yX0IiKSwgc2VwID0gIlxcLiIpICU+JQogICAgZ3JvdXBfYnkoZmFjdG9yX0EsIGZhY3Rvcl9CKSAlPiUKICAgIHN1bW1hcmlzZShtZWFuID0gbWVhbihjb25nKSwKICAgICAgICAgICAgICBjaV9sb3dlciA9IGNpX2xvd2VyKGNvbmcpLAogICAgICAgICAgICAgIGNpX3VwcGVyID0gY2lfdXBwZXIoY29uZykpICU+JQogICAgdW5ncm91cCgpICU+JQogICAgbGVmdF9qb2luKGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lCiAgICAgICAgICAgICAgICByZW5hbWVfYWxsKGZ1bnMocGFzdGUoLiwgIkEiLCBzZXAgPSAiXyIpKSkpICU+JQogICAgbGVmdF9qb2luKGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lCiAgICAgICAgICAgICAgICByZW5hbWVfYWxsKGZ1bnMocGFzdGUoLiwgIkIiLCBzZXAgPSAiXyIpKSkpCiAgCiAgcm0oaSwgaiwgY25hbWUsIHRlbXAsIGZhY3RvcnMpCiAgCiAgc2F2ZVJEUyhjb25nX2RmX2FkdWx0cywgZmlsZSA9ICIuLi9yZXN1bHRzL2NvbmdfZGZfYWR1bHRzLlJEUyIpCn0KYGBgCgpgYGB7ciBjb25nIG1pbiBhZHVsdHN9CiMgZmluZCBtaW5pbXVtIHZhbHVlIHRvIHNldCBjb25zdGFudCBsb3dlciBib3VuZCBvZiBwbG90cwptaW5fY29uZ19hZHVsdHMgPC0gY29uZ19kZl9hZHVsdHMgJT4lCiAgc3VtbWFyaXNlKG1pbl9jb25nID0gbWluKGNpX2xvd2VyLCBuYS5ybSA9IFQpKQpgYGAKCmBgYHtyIGNvbmcgY2lzIHVzIGJhc2UgYWR1bHRzLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC45fQojIEZJR1VSRSAzCmNvbmdfcGxvdF9mdW4oY29uZ19kZiA9IGNvbmdfZGZfYWR1bHRzLCB3aGljaF9jb3VudHJ5ID0gIlVTIikgKwogIHlsaW0obWluX2NvbmdfYWR1bHRzJG1pbl9jb25nLCAxKSArCiAgIyB5bGltKE5BLCAxKSArCiAgbGFicyh4ID0gTlVMTCkKZ2dzYXZlKCIuLi9maWd1cmVzL2ZpZzAzLnBuZyIpCmBgYAoKYGBge3IgY29uZyBjaXMgZ2ggYmFzZSBhZHVsdHMsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjl9CiMgRklHVVJFIFMxCmNvbmdfcGxvdF9mdW4oY29uZ19kZiA9IGNvbmdfZGZfYWR1bHRzICU+JQogICAgICAgICAgICAgICAgbXV0YXRlX2F0KCN2YXJzKGNvbnRhaW5zKCJsYWJkZXNjcmlwdCIpKSwKICAgICAgICAgICAgICAgICAgdmFycyhmYWN0b3JfbGFiZGVzY3JpcHRfQSksCiAgICAgICAgICAgICAgICAgIGZ1bnMoZ3N1YigiIFxcKCIsICJcblxcKCIsIC4pKSkgJT4lCiAgICAgICAgICAgICAgICBtdXRhdGVfYXQoI3ZhcnMoY29udGFpbnMoImxhYmRlc2NyaXB0IikpLAogICAgICAgICAgICAgICAgICB2YXJzKGZhY3Rvcl9sYWJkZXNjcmlwdF9BKSwKICAgICAgICAgICAgICAgICAgZnVucyhnc3ViKCJcXC8iLCAiXFwvXG4iLCAuKSkpLCAKICAgICAgICAgICAgICB3aGljaF9jb3VudHJ5ID0gIkdoYW5hIikgKwogIHlsaW0obWluX2NvbmdfYWR1bHRzJG1pbl9jb25nLCAxKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnUzAxLnBuZyIpCmBgYAoKYGBge3IgY29uZyBjaXMgdGggYmFzZSBhZHVsdHMsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjl9CiMgRklHVVJFIFMyCmNvbmdfcGxvdF9mdW4oY29uZ19kZiA9IGNvbmdfZGZfYWR1bHRzLCAKICAgICAgICAgICAgICB3aGljaF9jb3VudHJ5ID0gIlRoYWlsYW5kIikgKwogIHlsaW0obWluX2NvbmdfYWR1bHRzJG1pbl9jb25nLCAxKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnUzAyLnBuZyIpCmBgYAoKYGBge3IgY29uZyBjaXMgY2ggYmFzZSBhZHVsdHMsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjl9CiMgRklHVVJFIFMzCmNvbmdfcGxvdF9mdW4oY29uZ19kZiA9IGNvbmdfZGZfYWR1bHRzLCAKICAgICAgICAgICAgICB3aGljaF9jb3VudHJ5ID0gIkNoaW5hIikgKwogIHlsaW0obWluX2NvbmdfYWR1bHRzJG1pbl9jb25nLCAxKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnUzAzLnBuZyIpCmBgYAoKYGBge3IgY29uZyBjaXMgdnQgYmFzZSBhZHVsdHMsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjl9CiMgRklHVVJFIFM0CmNvbmdfcGxvdF9mdW4oY29uZ19kZiA9IGNvbmdfZGZfYWR1bHRzICU+JQogICAgICAgICAgICAgICAgbXV0YXRlX2F0KCN2YXJzKGNvbnRhaW5zKCJsYWJkZXNjcmlwdCIpKSwKICAgICAgICAgICAgICAgICAgdmFycyhmYWN0b3JfbGFiZGVzY3JpcHRfQSksCiAgICAgICAgICAgICAgICAgIGZ1bnMoZ3N1YigiIFxcKCIsICJcblxcKCIsIC4pKSkgJT4lCiAgICAgICAgICAgICAgICBtdXRhdGVfYXQoI3ZhcnMoY29udGFpbnMoImxhYmRlc2NyaXB0IikpLAogICAgICAgICAgICAgICAgICB2YXJzKGZhY3Rvcl9sYWJkZXNjcmlwdF9BKSwKICAgICAgICAgICAgICAgICAgZnVucyhnc3ViKCJcXC8iLCAiXFwvXG4iLCAuKSkpLCAKICAgICAgICAgICAgICB3aGljaF9jb3VudHJ5ID0gIlZhbnVhdHUiKSArCiAgeWxpbShtaW5fY29uZ19hZHVsdHMkbWluX2NvbmcsIDEpCmdnc2F2ZSgiLi4vZmlndXJlcy9maWdTMDQucG5nIikKYGBgCgpgYGB7ciBib2R5IG1pbmQgY29uZyBhZHVsdHN9CiMgIkluIGVhY2ggc2FtcGxlLCB0aGVyZSB3YXMgYSBmYWN0b3IgdGhhdCB3YXMgc2ltaWxhciB0byBVUyBhZHVsdHPigJkg4oCcYm9keeKAnSBmYWN0b3IuLi4KY29uZ19kZl9hZHVsdHMgJT4lIAogIGZpbHRlcihncmVwbCgiYm9keSIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0EpKSwgCiAgICAgICAgIGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQikpLAogICAgICAgICBjb3VudHJ5X0EgIT0gIlVTIiwgY291bnRyeV9CID09ICJVUyIpCgojICIuLi5hbmQgbm90IHNpbWlsYXIgdG8gdGhlIFVTIGFkdWx0IOKAnG1pbmTigJ0gZmFjdG9yLCAuLi4KY29uZ19kZl9hZHVsdHMgJT4lIAogIGZpbHRlcihncmVwbCgiYm9keSIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0EpKSwgCiAgICAgICAgIGdyZXBsKCJtaW5kIiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQikpLAogICAgICAgICBjb3VudHJ5X0EgIT0gIlVTIiwgY291bnRyeV9CID09ICJVUyIpCgojICIuLi4gYW5kIGEgZmFjdG9yIHRoYXQgd2FzIHNpbWlsYXIgdG8gVVMgYWR1bHRz4oCZIOKAnG1pbmTigJ0gZmFjdG9yLi4uCmNvbmdfZGZfYWR1bHRzICU+JSAKICBmaWx0ZXIoZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9BKSksIAogICAgICAgICBncmVwbCgibWluZCIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0IpKSwKICAgICAgICAgY291bnRyeV9BICE9ICJVUyIsIGNvdW50cnlfQiA9PSAiVVMiKQoKIyAiLi4uYW5kIG5vdCBzaW1pbGFyIHRvIHRoZSBVUyBhZHVsdCDigJxib2R54oCdIGZhY3Rvci4iCmNvbmdfZGZfYWR1bHRzICU+JSAKICBmaWx0ZXIoZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9BKSksIAogICAgICAgICBncmVwbCgiYm9keSIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0IpKSwKICAgICAgICAgY291bnRyeV9BICE9ICJVUyIsIGNvdW50cnlfQiA9PSAiVVMiKQpgYGAKCgojIENoaWxkcmVuCgojIyBTYW1wbGVzCgpgYGB7ciBzYW1wbGVzIGNoaWxkcmVufQpiaW5kX3Jvd3MoZF91c19jaGlsZHJlbiwgZF9naF9jaGlsZHJlbiwgZF90aF9jaGlsZHJlbiwgZF9jaF9jaGlsZHJlbiwgZF92dF9jaGlsZHJlbikgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwgbGV2ZWxzID0gbGV2ZWxzX2NvdW50cnkpKSAlPiUKICBkaXN0aW5jdChjb3VudHJ5LCBzdWJqX2lkKSAlPiUKICBjb3VudChjb3VudHJ5KSAlPiUgCiAgamFuaXRvcjo6YWRvcm5fdG90YWxzKCkKYGBgCgojIyBTY2FsZSB1c2UKCmBgYHtyIHNjYWxlIHVzZSBtZWFuIG92ZXJhbGwgY2hpbGRyZW59CmJpbmRfcm93cyhkX3VzX2NoaWxkcmVuLCBkX2doX2NoaWxkcmVuLCBkX3RoX2NoaWxkcmVuLCBkX2NoX2NoaWxkcmVuLCBkX3Z0X2NoaWxkcmVuKSAlPiUKICBtdXRhdGUoY291bnRyeSA9IGZhY3Rvcihjb3VudHJ5LCBsZXZlbHMgPSBsZXZlbHNfY291bnRyeSksCiAgICAgICAgIHJlc3BvbnNlX2NhdCA9IHJlY29kZV9mYWN0b3IocmVzcG9uc2VfY2F0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJubyIgPSAibm8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJraW5kIG9mIiA9ICJraW5kIG9mIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieWVzIiA9ICJ5ZXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWlzc2luZyA9ICJtaXNzaW5nIGRhdGEiKSkgJT4lCiAgY291bnQoY291bnRyeSwgcmVzcG9uc2VfY2F0KSAlPiUKICBjb21wbGV0ZShyZXNwb25zZV9jYXQsIG5lc3RpbmcoY291bnRyeSksIGZpbGwgPSBsaXN0KG4gPSAwKSkgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgbXV0YXRlKHByb3AgPSBuL3N1bShuLCBuYS5ybSA9IFQpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgc2VsZWN0KC1uKSAlPiUKICBzcHJlYWQocmVzcG9uc2VfY2F0LCBwcm9wKSAlPiUKICBqYW5pdG9yOjphZG9ybl9wY3RfZm9ybWF0dGluZyhkaWdpdHMgPSAyKQpgYGAKCiMjIEZhY3RvciByZXRlbnRpb246IHBhcmFsbGVsIGFuYWx5c2lzCgpgYGB7ciBwYXJhbGxlbCBkaXN0IGNoaWxkcmVuLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMC41fQojIE5PVEU6IHRoZXJlIGFwcGVhcnMgdG8gYmUgc29tZSB1bnJlbGlhYmlsaXR5L25vbi1yZXByb2R1Y2liaWxpdHkgaW4gcmVzdWx0cywgZXNwZWNpYWxseSBmb3IgdnQgYWR1bHRzLCB3aGljaCBJIGRvbid0IHVuZGVyc3RhbmQgLS0gc28gaGVyZSdzIHRoZSBkaXN0cmlidXRpb24gb3ZlciBvdXRjb21lcyBvZiBwYXJhbGxlbCBhbmFseXNpcyB3aXRoIDEwMCBpdGVyYXRpb25zLiBXZSdsbCBjaG9vc2UgdGhlIG1lZGlhbiBudW1iZXIgb2YgZmFjdG9ycy4KCmlmIChmaWxlLmV4aXN0cygiLi4vcmVzdWx0cy9wYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuLlJEUyIpKSB7CiAgCiAgcGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbiA8LSByZWFkUkRTKCIuLi9yZXN1bHRzL3BhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW4uUkRTIikKICAKfSBlbHNlIHsKICAKICBwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuIDwtIGRhdGEuZnJhbWUodXMgPSBOVUxMLCBnaCA9IE5VTEwsIHRoID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBOVUxMLCB2dCA9IE5VTEwpCiAgCiAgc2V0LnNlZWQoNTQzMjEpCiAgbl9jb3JlcyA8LSBwYXJhbGxlbDo6ZGV0ZWN0Q29yZXMoKQogIG9wdGlvbnMobWMuY29yZXMgPSBuX2NvcmVzKQogIAogIGZvciAoaSBpbiAxOjEwMCkgewogICAgcGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbltpLCAidXMiXSA8LSBmYS5wYXJhbGxlbChkX3VzX2NoaWxkcmVuX3csIHBsb3QgPSBGKSRuZmFjdAogICAgcGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbltpLCAiZ2giXSA8LSBmYS5wYXJhbGxlbChkX2doX2NoaWxkcmVuX3csIHBsb3QgPSBGKSRuZmFjdCAgICAgCiAgICBwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuW2ksICJ0aCJdIDwtIGZhLnBhcmFsbGVsKGRfdGhfY2hpbGRyZW5fdywgcGxvdCA9IEYpJG5mYWN0CiAgICBwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuW2ksICJjaCJdIDwtIGZhLnBhcmFsbGVsKGRfY2hfY2hpbGRyZW5fdywgcGxvdCA9IEYpJG5mYWN0CiAgICBwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuW2ksICJ2dCJdIDwtIGZhLnBhcmFsbGVsKGRfdnRfY2hpbGRyZW5fdywgcGxvdCA9IEYpJG5mYWN0CiAgfQogIAogIHNhdmVSRFMocGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbiwgZmlsZSA9ICIuLi9yZXN1bHRzL3BhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW4uUkRTIikKfQoKIyBwbG90CnBhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW4gJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJpdGVyIikgJT4lCiAgZ2F0aGVyKGNvdW50cnksIG5mYWN0LCAtaXRlcikgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ1cyIsICJnaCIsICJ0aCIsICJjaCIsICJ2dCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGxldmVsc19jb3VudHJ5KSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbmZhY3QpKSArCiAgZmFjZXRfZ3JpZCh+IGNvdW50cnkpICsKICBnZW9tX2JhcihzdGF0ID0gImNvdW50IikgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDEsIG1heChwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuKSArIDEpLAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEoMCwgMTAwLCAxKSkgKwogIGxhYnMoeCA9ICJOdW1iZXIgb2YgZmFjdG9ycyBzdWdnZXN0ZWQgYnkgZmEucGFyYWxsZWwoKSIpCmBgYAoKIyMgRXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lzCgpgYGB7ciBlZmEgY2hpbGRyZW59CnNldC5zZWVkKDU0MzIxKQoKIyBkbyBleHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzaXM6IGNoaWxkcmVuCmVmYV91c19jaGlsZHJlbiA8LSBmYV9mdW4oZF91c19jaGlsZHJlbl93LCBuID0gbWVkaWFuKHBhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW4kdXMpKQpjb2xuYW1lcyhlZmFfdXNfY2hpbGRyZW4kbG9hZGluZ3MpIDwtIHBhc3RlMCgidXNDSElMRFJFTl8iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX3VzX2NoaWxkcmVuJGxvYWRpbmdzKSkKCmVmYV9naF9jaGlsZHJlbiA8LSBmYV9mdW4oZF9naF9jaGlsZHJlbl93LCBuID0gbWVkaWFuKHBhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW4kZ2gpKQpjb2xuYW1lcyhlZmFfZ2hfY2hpbGRyZW4kbG9hZGluZ3MpIDwtIHBhc3RlMCgiZ2hDSElMRFJFTl8iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX2doX2NoaWxkcmVuJGxvYWRpbmdzKSkKCmVmYV90aF9jaGlsZHJlbiA8LSBmYV9mdW4oZF90aF9jaGlsZHJlbl93LCBuID0gbWVkaWFuKHBhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW4kdGgpKQpjb2xuYW1lcyhlZmFfdGhfY2hpbGRyZW4kbG9hZGluZ3MpIDwtIHBhc3RlMCgidGhDSElMRFJFTl8iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX3RoX2NoaWxkcmVuJGxvYWRpbmdzKSkKCmVmYV9jaF9jaGlsZHJlbiA8LSBmYV9mdW4oZF9jaF9jaGlsZHJlbl93LCBuID0gbWVkaWFuKHBhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW4kY2gpKQpjb2xuYW1lcyhlZmFfY2hfY2hpbGRyZW4kbG9hZGluZ3MpIDwtIHBhc3RlMCgiY2hDSElMRFJFTl8iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX2NoX2NoaWxkcmVuJGxvYWRpbmdzKSkKCmVmYV92dF9jaGlsZHJlbiA8LSBmYV9mdW4oZF92dF9jaGlsZHJlbl93LCBuID0gbWVkaWFuKHBhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW4kdnQpKQpjb2xuYW1lcyhlZmFfdnRfY2hpbGRyZW4kbG9hZGluZ3MpIDwtIHBhc3RlMCgidnRDSElMRFJFTl8iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX3Z0X2NoaWxkcmVuJGxvYWRpbmdzKSkKYGBgCgpgYGB7ciBmYWN0b3IgbmFtZXMgY2hpbGRyZW59CmZhY3Rvcl9uYW1lc19jaGlsZHJlbiA8LSBkYXRhLmZyYW1lKGZhY3RvciA9IGMoY29sbmFtZXMoZWZhX3VzX2NoaWxkcmVuJGxvYWRpbmdzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfZ2hfY2hpbGRyZW4kbG9hZGluZ3MpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV90aF9jaGlsZHJlbiRsb2FkaW5ncyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX2NoX2NoaWxkcmVuJGxvYWRpbmdzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfdnRfY2hpbGRyZW4kbG9hZGluZ3MpKSkgJT4lCiAgbXV0YXRlKGFnZV9ncm91cCA9ICJjaGlsZHJlbiIpICU+JQogIG11dGF0ZShjb3VudHJ5ID0gY2FzZV93aGVuKGdyZXBsKCJedXMiLCBmYWN0b3IpIH4gIlVTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiXmdoIiwgZmFjdG9yKSB+ICJHaGFuYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoIl50aCIsIGZhY3RvcikgfiAiVGhhaWxhbmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJeY2giLCBmYWN0b3IpIH4gIkNoaW5hIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiXnZ0IiwgZmFjdG9yKSB+ICJWYW51YXR1IiksCiAgICAgICAgIGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwgbGV2ZWxzX2NvdW50cnkpKSAlPiUKICBtdXRhdGUoZmFjdG9yX25hbWUgPSBnc3ViKCJedXMiLCAiVVMgIiwgZmFjdG9yKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJeZ2giLCAiR2guICIsIGZhY3Rvcl9uYW1lKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJedGgiLCAiVGguICIsIGZhY3Rvcl9uYW1lKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJeY2giLCAiQ2guICIsIGZhY3Rvcl9uYW1lKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJednQiLCAiVmEuICIsIGZhY3Rvcl9uYW1lKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJDSElMRFJFTiIsICJjaGlsZHJlbiIsIGZhY3Rvcl9uYW1lKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJfRiIsICIgRmFjdG9yICIsIGZhY3Rvcl9uYW1lKSkgJT4lCiAgbXV0YXRlKGZhY3Rvcl9kZXNjcmlwdCA9IHJlY29kZShmYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c0NISUxEUkVOX0YxID0gIkJvZHktbGlrZSwgbmVnYXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNDSElMRFJFTl9GMiA9ICJIZWFydC1saWtlLCBwb3NpdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c0NISUxEUkVOX0YzID0gIk1pbmQtbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaENISUxEUkVOX0YxID0gIkJvZHktbGlrZSwgbmVnYXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2hDSElMRFJFTl9GMiA9ICJNaW5kLWxpa2UsIHBvc2l0aXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdoQ0hJTERSRU5fRjMgPSAiUHJheSwgYWRkLCBldGMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoQ0hJTERSRU5fRjEgPSAiQm9keS1saWtlLCBwb3NpdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aENISUxEUkVOX0YyID0gIkhlYXJ0LWxpa2UsIG5lZ2F0aXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoQ0hJTERSRU5fRjMgPSAiTWluZC1saWtlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoQ0hJTERSRU5fRjQgPSAiQWRkLCBwcmF5LCBldGMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQ0hJTERSRU5fRjEgPSAiSGVhcnQtbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaENISUxEUkVOX0YyID0gIk1pbmQtbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaENISUxEUkVOX0YzID0gIkJvZHktbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaENISUxEUkVOX0Y0ID0gIlByYXksIGV0Yy4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnRDSElMRFJFTl9GMSA9ICJCb2R5LWxpa2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnRDSElMRFJFTl9GMiA9ICJNaW5kLWxpa2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnRDSElMRFJFTl9GMyA9ICJIZWFydC1saWtlIiksCiAgICAgICAgIGZhY3Rvcl9sYWJkZXNjcmlwdCA9IHBhc3RlKGdzdWIoIi4qX0YiLCAiRiIsIGZhY3RvciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9kZXNjcmlwdCwgc2VwID0gIjogIikpCmBgYAoKIyMgRmFjdG9yIGxvYWRpbmdzCgpgYGB7ciBvcmRlciBjaGlsZHJlbn0KIyBvcmRlciBjYXBhY2l0aWVzOiBjaGlsZHJlbgpvcmRlcl91c19jaGlsZHJlbiA8LSBmYS5zb3J0KGVmYV91c19jaGlsZHJlbikkbG9hZGluZ3NbXSAlPiUgcm93bmFtZXMoKQpvcmRlcl9naF9jaGlsZHJlbiA8LSBmYS5zb3J0KGVmYV9naF9jaGlsZHJlbikkbG9hZGluZ3NbXSAlPiUgcm93bmFtZXMoKQpvcmRlcl90aF9jaGlsZHJlbiA8LSBmYS5zb3J0KGVmYV90aF9jaGlsZHJlbikkbG9hZGluZ3NbXSAlPiUgcm93bmFtZXMoKQpvcmRlcl9jaF9jaGlsZHJlbiA8LSBmYS5zb3J0KGVmYV9jaF9jaGlsZHJlbikkbG9hZGluZ3NbXSAlPiUgcm93bmFtZXMoKQpvcmRlcl92dF9jaGlsZHJlbiA8LSBmYS5zb3J0KGVmYV92dF9jaGlsZHJlbikkbG9hZGluZ3NbXSAlPiUgcm93bmFtZXMoKQpgYGAKCmBgYHtyIGxvYWRpbmdzIGNoaWxkcmVufQojIGNvbXBpbGUgbG9hZGluZ3M6IGNoaWxkcmVuCmxvYWRpbmdzX2NoaWxkcmVuIDwtIGJpbmRfcm93cygKICBsb2FkaW5nc19mdW4oZWZhX3VzX2NoaWxkcmVuKSAlPiUgbXV0YXRlKGNvdW50cnkgPSAiVVMiKSwKICBsb2FkaW5nc19mdW4oZWZhX2doX2NoaWxkcmVuKSAlPiUgbXV0YXRlKGNvdW50cnkgPSAiR2hhbmEiKSwKICBsb2FkaW5nc19mdW4oZWZhX3RoX2NoaWxkcmVuKSAlPiUgbXV0YXRlKGNvdW50cnkgPSAiVGhhaWxhbmQiKSwKICBsb2FkaW5nc19mdW4oZWZhX2NoX2NoaWxkcmVuKSAlPiUgbXV0YXRlKGNvdW50cnkgPSAiQ2hpbmEiKSwKICBsb2FkaW5nc19mdW4oZWZhX3Z0X2NoaWxkcmVuKSAlPiUgbXV0YXRlKGNvdW50cnkgPSAiVmFudWF0dSIpKSAlPiUKICBtdXRhdGUoY291bnRyeSA9IGZhY3Rvcihjb3VudHJ5LCBsZXZlbHMgPSBsZXZlbHNfY291bnRyeSksCiAgICAgICAgIGNhcGFjaXR5X29yZF91cyA9IGZhY3RvcihjYXBhY2l0eSwgbGV2ZWxzID0gb3JkZXJfdXNfY2hpbGRyZW4pLAogICAgICAgICBjYXBhY2l0eV9vcmRfZ2ggPSBmYWN0b3IoY2FwYWNpdHksIGxldmVscyA9IG9yZGVyX2doX2NoaWxkcmVuKSwKICAgICAgICAgY2FwYWNpdHlfb3JkX3RoID0gZmFjdG9yKGNhcGFjaXR5LCBsZXZlbHMgPSBvcmRlcl90aF9jaGlsZHJlbiksCiAgICAgICAgIGNhcGFjaXR5X29yZF9jaCA9IGZhY3RvcihjYXBhY2l0eSwgbGV2ZWxzID0gb3JkZXJfY2hfY2hpbGRyZW4pLAogICAgICAgICBjYXBhY2l0eV9vcmRfdnQgPSBmYWN0b3IoY2FwYWNpdHksIGxldmVscyA9IG9yZGVyX3Z0X2NoaWxkcmVuKSkgJT4lCiAgYXJyYW5nZShjb3VudHJ5LCBmYWN0b3IsIGRlc2MoYWJzKGxvYWRpbmcpKSwgY2FwYWNpdHkpICU+JQogIG11dGF0ZShvcmRlciA9IDE6bnJvdyguKSkgJT4lCiAgbGVmdF9qb2luKGZhY3Rvcl9uYW1lc19jaGlsZHJlbikKYGBgCgpgYGB7ciBoZWF0bWFwcyBieSBzaXRlIGNoaWxkcmVuLCBmaWcud2lkdGggPSAxNSwgZmlnLmFzcCA9IDAuMjV9CnBsb3RfZ3JpZChoZWF0bWFwX2Z1bihlZmFfdXNfY2hpbGRyZW4sIAogICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gZmFjdG9yX25hbWVzX2NoaWxkcmVuICU+JQogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoY291bnRyeSA9PSAiVVMiKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KGZhY3Rvcl9sYWJkZXNjcmlwdCkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdCgpKSArIAogICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICAgICAgICAgICAgbGFicyh0aXRsZSA9ICJVUzogY2hpbGRyZW4iKSwKICAgICAgICAgIGhlYXRtYXBfZnVuKGVmYV9naF9jaGlsZHJlbiwKICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19jaGlsZHJlbiAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGNvdW50cnkgPT0gIkdoYW5hIikgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChmYWN0b3JfbGFiZGVzY3JpcHQpICU+JQogICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QoKSkgKyAKICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICAgICAgICAgIGxhYnModGl0bGUgPSAiR0hBTkE6IGNoaWxkcmVuIiksCiAgICAgICAgICBoZWF0bWFwX2Z1bihlZmFfdGhfY2hpbGRyZW4sCiAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfY2hpbGRyZW4gJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihjb3VudHJ5ID09ICJUaGFpbGFuZCIpICU+JQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoZmFjdG9yX2xhYmRlc2NyaXB0KSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KCkpICsgCiAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgICAgICAgICBsYWJzKHRpdGxlID0gIlRIQUlMQU5EOiBjaGlsZHJlbiIpLAogICAgICAgICAgaGVhdG1hcF9mdW4oZWZhX2NoX2NoaWxkcmVuLAogICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gZmFjdG9yX25hbWVzX2NoaWxkcmVuICU+JQogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoY291bnRyeSA9PSAiQ2hpbmEiKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KGZhY3Rvcl9sYWJkZXNjcmlwdCkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdCgpKSArIAogICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICAgICAgICAgICAgbGFicyh0aXRsZSA9ICJDSElOQTogY2hpbGRyZW4iKSwKICAgICAgICAgIGhlYXRtYXBfZnVuKGVmYV92dF9jaGlsZHJlbiwKICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19jaGlsZHJlbiAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGNvdW50cnkgPT0gIlZhbnVhdHUiKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KGZhY3Rvcl9sYWJkZXNjcmlwdCkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdCgpKSArIAogICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICAgICAgICAgICAgbGFicyh0aXRsZSA9ICJWQU5VQVRVOiBjaGlsZHJlbiIpLAogICAgICAgICAgbmNvbCA9IDUpCmBgYAoKYGBge3IgaGVhdG1hcCBjaGlsZHJlbiwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuN30KIyBtYWtlIGhlYXRtYXAgZmlndXJlOiBjaGlsZHJlbgpsb2FkaW5nc19jaGlsZHJlbiAlPiUKICBtdXRhdGUoZmFjdG9yX251bSA9IGFzLm51bWVyaWMoZ3N1YigiLipGIiwgIiIsIGZhY3RvcikpKSAlPiUKICBtdXRhdGUoc2FtcGxlID0gcGFzdGUoY291bnRyeSwgImNoaWxkcmVuIiwgc2VwID0gIlxuIikpICU+JQogIGxlZnRfam9pbihmYWN0b3JfbmFtZXNfY2hpbGRyZW4pICU+JQogIG11dGF0ZShjb3VudHJ5ID0gZmFjdG9yKGNvdW50cnksIGxldmVscyA9IGxldmVsc19jb3VudHJ5KSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihmYWN0b3JfbGFiZGVzY3JpcHQsIGZhY3Rvcl9udW0pLCAKICAgICAgICAgICAgIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKGNhcGFjaXR5X29yZF91cykpLAogICAgICAgICAgICAgIyB5ID0gcmVvcmRlcihjYXBhY2l0eSwgZGVzYyhjYXBhY2l0eV9vcmRfZWMpKSwgCiAgICAgICAgICAgICAjIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKGNhcGFjaXR5X29yZF9naCkpLAogICAgICAgICAgICAgIyB5ID0gcmVvcmRlcihjYXBhY2l0eSwgZGVzYyhjYXBhY2l0eV9vcmRfdGgpKSwKICAgICAgICAgICAgICMgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2MoY2FwYWNpdHlfb3JkX2NoKSksCiAgICAgICAgICAgICAjIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKGNhcGFjaXR5X29yZF92dCkpLAogICAgICAgICAgICAgZmlsbCA9IGxvYWRpbmcpKSArCiAgZmFjZXRfZ3JpZCh+IHJlb3JkZXIoc2FtcGxlLCBhcy5udW1lcmljKGNvdW50cnkpKSwgc2NhbGVzID0gImZyZWUiLCBzcGFjZSA9ICJmcmVlIikgKwogIGdlb21fdGlsZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gZm9ybWF0KHJvdW5kKGxvYWRpbmcsIDIpLCBuc21hbGwgPSAyKSksIHNpemUgPSAzKSArCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJSZFlsQnUiLCBsaW1pdHMgPSBjKC0xLCAxKSwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKGJhcmhlaWdodCA9IDIwLCBiYXJ3aWR0aCA9IDAuNSkpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwKICAgICAgICBwYW5lbC5zcGFjaW5nLnggPSB1bml0KDAuOCwgImxpbmVzIiksCiAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgZmFjZSA9ICJib2xkIikpICsKICBsYWJzKHggPSBOVUxMLCB5ID0gIkNhcGFjaXR5IiwgZmlsbCA9ICJGYWN0b3JcbmxvYWRpbmciKQpgYGAKCiMjIENvbmdydWVuY2UKClNlZSBbQWxsIHNhbXBsZXNdLCBiZWxvdy4KCiMjIEJvb3RzdHJhcHBlZCBjb25ncnVlbmNlCgpgYGB7ciBib290c3RyYXAgY29uZ3J1ZW5jZSBjaGlsZHJlbn0KaWYgKGZpbGUuZXhpc3RzKCIuLi9yZXN1bHRzL2NvbmdfZGZfY2hpbGRyZW4uUkRTIikpIHsKICAKICBjb25nX2RmX2NoaWxkcmVuIDwtIHJlYWRSRFMoIi4uL3Jlc3VsdHMvY29uZ19kZl9jaGlsZHJlbi5SRFMiKQogIAp9IGVsc2UgewogIAogIGJzX2NoaWxkcmVuIDwtIGxvYWRpbmdzX2NoaWxkcmVuICU+JQogICAgc2VsZWN0KGNhcGFjaXR5LCBmYWN0b3IsIGxvYWRpbmcpICU+JQogICAgc3ByZWFkKGZhY3RvciwgbG9hZGluZykgJT4lCiAgICBmdWxsX2pvaW4obG9hZGluZ3NfYWR1bHRzICU+JQogICAgICAgICAgICAgICAgc2VsZWN0KGNhcGFjaXR5LCBmYWN0b3IsIGxvYWRpbmcpICU+JQogICAgICAgICAgICAgICAgc3ByZWFkKGZhY3RvciwgbG9hZGluZykpICU+JQogICAgc2VsZWN0KC1jYXBhY2l0eSkgJT4lCiAgICBzanN0YXRzOjpib290c3RyYXAoMTAwMCkgCiAgCiAgY29uZ19kZl9jaGlsZHJlbiA8LSBkYXRhLmZyYW1lKE5VTEwpCiAgCiAgZm9yIChrIGluIGxldmVsc19jb3VudHJ5KSB7CiAgICAKICAgIGZhY3RvcnNfY2hpbGRyZW4gPC0gbGV2ZWxzKGZhY3Rvcihsb2FkaW5nc19jaGlsZHJlbiRmYWN0b3JbCiAgICAgIGxvYWRpbmdzX2NoaWxkcmVuJGNvdW50cnkgPT0ga10pKQogICAgZmFjdG9yc19hZHVsdHMgPC0gbGV2ZWxzKGZhY3Rvcihsb2FkaW5nc19hZHVsdHMkZmFjdG9yWwogICAgICBsb2FkaW5nc19hZHVsdHMkY291bnRyeSA9PSBrXSkpCiAgICAKICAgIGZvciAoaSBpbiBmYWN0b3JzX2NoaWxkcmVuKSB7CiAgICAgIGZvciAoaiBpbiBmYWN0b3JzX2FkdWx0cykgewogICAgICAgIGNuYW1lIDwtIHBhc3RlKGksIGosIHNlcCA9ICIuIikKICAgICAgICB0ZW1wIDwtIGJzX2NoaWxkcmVuICU+JQogICAgICAgICAgbXV0YXRlKGNvbmcgPSBtYXBfZGJsKHN0cmFwLCB+bHNhOjpjb3NpbmUoYXMuZGF0YS5mcmFtZSgueClbLGldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuZGF0YS5mcmFtZSgueClbLGpdKSkpCiAgICAgICAgY29uZ19kZl9jaGlsZHJlblsxOjEwMDAsIGNuYW1lXSA8LSB0ZW1wJGNvbmcKICAgICAgfQogICAgfQogICAgCiAgICBybShpLCBqLCBjbmFtZSwgdGVtcCwgZmFjdG9yc19jaGlsZHJlbiwgZmFjdG9yc19hZHVsdHMpCiAgICAKICB9CiAgCiAgcm0oaykKICAKICBjb25nX2RmX2NoaWxkcmVuIDwtIGNvbmdfZGZfY2hpbGRyZW4gJT4lCiAgICBnYXRoZXIoZmFjdG9yX3BhaXIsIGNvbmcpICU+JQogICAgc2VwYXJhdGUoZmFjdG9yX3BhaXIsIGludG8gPSBjKCJmYWN0b3JfQSIsICJmYWN0b3JfQiIpLCBzZXAgPSAiXFwuIikgJT4lCiAgICBncm91cF9ieShmYWN0b3JfQSwgZmFjdG9yX0IpICU+JQogICAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKGNvbmcpLAogICAgICAgICAgICAgIGNpX2xvd2VyID0gY2lfbG93ZXIoY29uZyksCiAgICAgICAgICAgICAgY2lfdXBwZXIgPSBjaV91cHBlcihjb25nKSkgJT4lCiAgICB1bmdyb3VwKCkgJT4lCiAgICBmdWxsX2pvaW4oZmFjdG9yX25hbWVzX2NoaWxkcmVuICU+JQogICAgICAgICAgICAgICAgcmVuYW1lX2FsbChmdW5zKHBhc3RlKC4sICJBIiwgc2VwID0gIl8iKSkpKSAlPiUKICAgIGZ1bGxfam9pbihmYWN0b3JfbmFtZXNfYWR1bHRzICU+JQogICAgICAgICAgICAgICAgcmVuYW1lX2FsbChmdW5zKHBhc3RlKC4sICJCIiwgc2VwID0gIl8iKSkpKSAlPiUKICAgIG11dGF0ZShmYWN0b3JfYmhtX0EgPSBjYXNlX3doZW4oCiAgICAgIGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQSkpIH4gIkJvZHktbGlrZVxuY2hpbGQgZmFjdG9yIiwKICAgICAgZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9BKSkgfiAiTWluZC1saWtlXG5jaGlsZCBmYWN0b3IiLAogICAgICBncmVwbCgiaGVhcnQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9BKSkgfiAiSGVhcnQtbGlrZVxuY2hpbGQgZmFjdG9yIiwKICAgICAgVFJVRSB+ICJPdGhlciIpKSAlPiUKICAgIG11dGF0ZShmYWN0b3JfYmhtX0IgPSBjYXNlX3doZW4oCiAgICAgIGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQikpIH4gIkxvY2FsIGFkdWx0czpcbkJvZHktbGlrZSBmYWN0b3IiLAogICAgICBncmVwbCgibWluZCIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0IpKSB+ICJMb2NhbCBhZHVsdHM6XG5NaW5kLWxpa2UgZmFjdG9yIiwKICAgICAgZ3JlcGwoImhlYXJ0IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQikpIH4gIkxvY2FsIGFkdWx0czpcbkhlYXJ0LWxpa2UgZmFjdG9yIiwKICAgICAgVFJVRSB+ICJMb2NhbCBhZHVsdHM6XG5PdGhlciBmYWN0b3IiKSkKICAKICBzYXZlUkRTKGNvbmdfZGZfY2hpbGRyZW4sIGZpbGUgPSAiLi4vcmVzdWx0cy9jb25nX2RmX2NoaWxkcmVuLlJEUyIpCn0KYGBgCgpgYGB7ciBjb25nIG1pbiBjaGlsZHJlbn0KIyBmaW5kIG1pbmltdW0gdmFsdWUgdG8gc2V0IGNvbnN0YW50IGxvd2VyIGJvdW5kIG9mIHBsb3RzCm1pbl9jb25nX2NoaWxkcmVuIDwtIGNvbmdfZGZfY2hpbGRyZW4gJT4lCiAgc3VtbWFyaXNlKG1pbl9jb25nID0gbWluKGNpX2xvd2VyLCBuYS5ybSA9IFQpKQpgYGAKCmBgYHtyIGNvbmcgY2lzIGNoaWxkcmVuLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMS40fQojIEZJR1VSRSA0CiMgZmlnLmFzcCBjaG9zZW4gdG8ga2VlcCBhYnNvbHV0ZSBoZWlnaHQgb2YgeS1heGlzIHJlbGF0aXZlbHkgc2ltaWxhciBhY3Jvc3MgYWR1bHRzIGFuZCBjaGlsZHJlbgpjb25nX2RmX2NoaWxkcmVuICU+JQogIG11dGF0ZShzYW1wbGVfQSA9IHBhc3RlKGNvdW50cnlfQSwgYWdlX2dyb3VwX0EsIHNlcCA9ICJcbiIpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBmYWN0b3JfbGFiZGVzY3JpcHRfQSwgeSA9IG1lYW4pKSArCiAgZmFjZXRfZ3JpZChmYWN0b3JfYmhtX0IgfiByZW9yZGVyKHNhbXBsZV9BLCBhcy5udW1lcmljKGNvdW50cnlfQSkpLCAKICAgICAgICAgICAgIHNjYWxlcyA9ICJmcmVlX3giLCBzcGFjZSA9ICJmcmVlX3giKSArCiAgYW5ub3RhdGUoInJlY3QiLCB4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSAwLjg1LAogICAgICAgICAgIGZpbGwgPSAiZ3JheTIwIiwgYWxwaGEgPSAwLjIpICsKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gMC44NSwgeW1heCA9IDAuOTUsCiAgICAgICAgICAgZmlsbCA9IHZpcmlkaXNMaXRlOjp2aXJpZGlzKDIsIGJlZ2luID0gMC43NS8yLCBlbmQgPSAwLjc1KVsxXSwgYWxwaGEgPSAwLjIpICsKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gMC45NSwgeW1heCA9IEluZiwKICAgICAgICAgICBmaWxsID0gdmlyaWRpc0xpdGU6OnZpcmlkaXMoMiwgYmVnaW4gPSAwLjc1LzIsIGVuZCA9IDAuNzUpWzJdLCBhbHBoYSA9IDAuMikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuODUsIGx0eSA9IDIsIGNvbG9yID0gImdyYXkxMCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjk1LCBsdHkgPSAyLCBjb2xvciA9ICJncmF5MTAiKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksCiAgICAgICAgICAgICAgICAgIGZhdHRlbiA9IDMsCiAgICAgICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRikgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBmb3JtYXQocm91bmQobWVhbiwgMiksIG5zbWFsbCA9IDIpLAogICAgICAgICAgICAgICAgeSA9IGlmZWxzZShjaV9sb3dlciA8IDAuMiwgY2lfdXBwZXIgKyAwLjA1LCBjaV9sb3dlciAtIDAuMDUpLAogICAgICAgICAgICAgICAgdmp1c3QgPSBpZmVsc2UoY2lfbG93ZXIgPCAwLjIsIDAsIDEpKSkgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoLTEsIDEsIDAuMiksCiAgICAgICAgICAgICAgICAgICAgIGV4cGFuZCA9IGV4cGFuc2lvbihhZGQgPSAwLjA1KSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIiwgYWVzdGhldGljcyA9IGMoImNvbG9yIiwgImZpbGwiKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSAyMToyNSkgKwogIGxhYnMoeCA9IE5VTEwsCiAgICAgICB5ID0gZXhwcmVzc2lvbigiU2ltaWxhcml0eSAiKGl0YWxpYyhyW2NdKSkpKSArIAogIGd1aWRlcyhjb2xvciA9ICJub25lIiwgZmlsbCA9ICJub25lIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGwgPSBzY2FsZXM6OmFscGhhKCJ3aGl0ZSIsIDApLCBjb2xvciA9ICJibGFjayIpLAogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBmYWNlID0gImJvbGQiKSwgCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoNS41LCA1LjUsIDUuNSwgMTUuNSksICJwb2ludCIpKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnMDQucG5nIikKYGBgCgpgYGB7ciBib2R5IG1pbmQgY29uZyBjaGlsZHJlbn0KIyAiSW4gZWFjaCBzYW1wbGUsIHRoZXJlIHdhcyBhIGZhY3RvciB0aGF0IHdhcyBzaW1pbGFyIHRvIGxvY2FsIGFkdWx0c+KAmSDigJxib2R5LWxpa2XigJ0gZmFjdG9yLi4uCmNvbmdfZGZfY2hpbGRyZW4gJT4lIAogIGZpbHRlcihncmVwbCgiYm9keSIsIHRvbG93ZXIoZmFjdG9yX2JobV9BKSksIAogICAgICAgICBncmVwbCgiYm9keSIsIHRvbG93ZXIoZmFjdG9yX2JobV9CKSkpCgojICIuLi5hbmQgbm90IHNpbWlsYXIgdG8gdGhlaXIg4oCcbWluZC1saWtl4oCdIGZhY3RvciwgLi4uCmNvbmdfZGZfY2hpbGRyZW4gJT4lIAogIGZpbHRlcihncmVwbCgiYm9keSIsIHRvbG93ZXIoZmFjdG9yX2JobV9BKSksIAogICAgICAgICBncmVwbCgibWluZCIsIHRvbG93ZXIoZmFjdG9yX2JobV9CKSkpCgojICIuLi4gYW5kIGEgZmFjdG9yIHRoYXQgd2FzIHNpbWlsYXIgdG8gbG9jYWwgYWR1bHRz4oCZIOKAnG1pbmQtbGlrZeKAnSBmYWN0b3IuLi4KY29uZ19kZl9jaGlsZHJlbiAlPiUgCiAgZmlsdGVyKGdyZXBsKCJtaW5kIiwgdG9sb3dlcihmYWN0b3JfYmhtX0EpKSwgCiAgICAgICAgIGdyZXBsKCJtaW5kIiwgdG9sb3dlcihmYWN0b3JfYmhtX0IpKSkKCiMgIi4uLmFuZCBub3Qgc2ltaWxhciB0byB0aGVpciDigJxib2R5LWxpa2XigJ0gZmFjdG9yLiIKY29uZ19kZl9jaGlsZHJlbiAlPiUgCiAgZmlsdGVyKGdyZXBsKCJtaW5kIiwgdG9sb3dlcihmYWN0b3JfYmhtX0EpKSwgCiAgICAgICAgIGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfYmhtX0IpKSkKYGBgCgoKIyBBbGwgc2FtcGxlcwoKIyMgQ29uZ3J1ZW5jZQoKYGBge3IgY29uZ3J1ZW5jZSBhbGwgc2FtcGxlc30KY29uZ19hbGwgPC0gZmEuY29uZ3J1ZW5jZSh4ID0gbGlzdChlZmFfdXNfYWR1bHRzJGxvYWRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV9naF9hZHVsdHMkbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhX3RoX2FkdWx0cyRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfY2hfYWR1bHRzJGxvYWRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV92dF9hZHVsdHMkbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhX3VzX2NoaWxkcmVuJGxvYWRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV9naF9jaGlsZHJlbiRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfdGhfY2hpbGRyZW4kbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhX2NoX2NoaWxkcmVuJGxvYWRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV92dF9jaGlsZHJlbiRsb2FkaW5ncyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gNSkgJT4lCiAgIyBnZXRfdXBwZXJfdHJpX2Z1bigpICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oImZhY3Rvcl9BIikgJT4lCiAgZ2F0aGVyKGZhY3Rvcl9CLCBjb25nLCAtZmFjdG9yX0EpICU+JQogIGxlZnRfam9pbihiaW5kX3Jvd3MoZmFjdG9yX25hbWVzX2FkdWx0cyAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZV9hbGwoZnVucyhwYXN0ZSguLCAiQSIsIHNlcCA9ICJfIikpKSwKICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lc19jaGlsZHJlbiAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lX2FsbChmdW5zKHBhc3RlKC4sICJBIiwgc2VwID0gIl8iKSkpKSkgJT4lCiAgbGVmdF9qb2luKGJpbmRfcm93cyhmYWN0b3JfbmFtZXNfYWR1bHRzICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lX2FsbChmdW5zKHBhc3RlKC4sICJCIiwgc2VwID0gIl8iKSkpLAogICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzX2NoaWxkcmVuICU+JQogICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVfYWxsKGZ1bnMocGFzdGUoLiwgIkIiLCBzZXAgPSAiXyIpKSkpKQpgYGAKCmBgYHtyIGNvbmcgYWxsIHBhaXJzIGZvcm1hdH0KIyBtYWtlIHdpZGUtZm9ybSB2ZXJzaW9uIG9mIGRmCmNvbmdfYWxsX3cgPC0gY29uZ19hbGwgJT4lCiAgc2VsZWN0KGZhY3Rvcl9BLCBmYWN0b3JfQiwgY29uZykgJT4lCiAgc3ByZWFkKGZhY3Rvcl9CLCBjb25nKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoImZhY3Rvcl9BIikKCiMgdHJlYXQgc2ltaWxhcml0eSBtYXRyaXggYXMgaWYgaXQgd2VyZSB0aGUgY29ycmVsYXRpb24gbWF0cml4IGZvciBoY2x1c3QKcm93Lm9yZGVyIDwtIGhjbHVzdChhcy5kaXN0KCgxIC0gY29uZ19hbGxfdykvMikpJG9yZGVyCmNvbC5vcmRlciA8LSBoY2x1c3QoYXMuZGlzdCh0KCgxIC0gY29uZ19hbGxfdykvMikpKSRvcmRlcgoKIyByZS1vcmRlciBtYXRyaXggYWNjb3JpbmcgdG8gY2x1c3RlcmluZwpjb25nX2FsbF93IDwtIGNvbmdfYWxsX3dbcm93Lm9yZGVyLCBjb2wub3JkZXJdIAoKIyBmb3Igc29tZSByZWFzb24gcmVzaGFwZTI6Om1lbHQoKSB3b3JrcyBiZXR0ZXIgdGhhbiBjdXJyZW50IHRpZHl2ZXJzZSBmdW5jdGlvbnMuLi4KY29uZ19hbGxfb3JkZXJlZCA8LSBtZWx0KGFzLm1hdHJpeChjb25nX2FsbF93KSkgJT4lCiAgcmVuYW1lKGZhY3Rvcl9BX29yZGVyZWQgPSBWYXIxLCAKICAgICAgICAgZmFjdG9yX0Jfb3JkZXJlZCA9IFZhcjIsCiAgICAgICAgIGNvbmcgPSB2YWx1ZSkgJT4lCiAgbXV0YXRlKGZhY3Rvcl9BID0gYXMuY2hhcmFjdGVyKGZhY3Rvcl9BX29yZGVyZWQpLAogICAgICAgICBmYWN0b3JfQiA9IGFzLmNoYXJhY3RlcihmYWN0b3JfQl9vcmRlcmVkKSkgJT4lCiAgZnVsbF9qb2luKGNvbmdfYWxsICU+JSBzZWxlY3QoY29udGFpbnMoIl9BIikpICU+JSBkaXN0aW5jdCgpKSAlPiUKICBmdWxsX2pvaW4oY29uZ19hbGwgJT4lIHNlbGVjdChjb250YWlucygiX0IiKSkgJT4lIGRpc3RpbmN0KCkpICU+JQogIG11dGF0ZShsYWJfQSA9IHBhc3RlKHBhc3RlKGNvdW50cnlfQSwgYWdlX2dyb3VwX0EpLCBmYWN0b3JfbGFiZGVzY3JpcHRfQSwgc2VwID0gIiwgIiksCiAgICAgICAgIGxhYl9CID0gcGFzdGUocGFzdGUoY291bnRyeV9CLCBhZ2VfZ3JvdXBfQiksIGZhY3Rvcl9sYWJkZXNjcmlwdF9CLCBzZXAgPSAiLCAiKSkKIyBtdXRhdGUoc2FtcGxlX0EgPSBwYXN0ZShjb3VudHJ5X0EsIGFnZV9ncm91cF9BLCBzZXAgPSAiLCAiKSwKIyAgICAgICAgc2FtcGxlX0IgPSBwYXN0ZShjb3VudHJ5X0IsIGFnZV9ncm91cF9CLCBzZXAgPSAiLCAiKSwKIyAgICAgICAgbGFiX0EgPSBwYXN0ZShzYW1wbGVfQSwgZmFjdG9yX2xhYmRlc2NyaXB0X0EsIHNlcCA9ICIgIiksCiMgICAgICAgIGxhYl9CID0gcGFzdGUoc2FtcGxlX0IsIGZhY3Rvcl9sYWJkZXNjcmlwdF9CLCBzZXAgPSAiICIpKQpgYGAKCmBgYHtyIGNvbmcgYWxsIHBhaXJzIHBsb3QsIGZpZy53aWR0aCA9IDkuNSwgZmlnLmFzcCA9IDAuOX0KIyBGSUdVUkUgMgpjb25nX2xvd2VyX2xpbSA8LSBpZmVsc2UobWluKGNvbmdfYWxsX29yZGVyZWQkY29uZykgPiAtMC4wNSwgLTAuMDUsIAogICAgICAgICAgICAgICAgICAgICAgICAgbWluKGNvbmdfYWxsX29yZGVyZWQkY29uZykpCiMgY29uZ19wbG90X2NvbG9ycyA8LSBjKCJyZWQ0IiwgImJsdWU0IiwgImRhcmtvcmNoaWQ0IiwgImJsYWNrIikKIyBjb25nX3Bsb3RfY29sb3JzIDwtIGMoImJsYWNrIiwgImJsYWNrIiwgImJsYWNrIiwgImJsYWNrIikKY29uZ19wbG90X2NvbG9ycyA8LSBjKCJyZWQ0IiwgInJlZDQiLCAicmVkNCIsICJibGFjayIpCgpjb25nX2FsbF9vcmRlcmVkICU+JQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIobGFiX0EsIGFzLm51bWVyaWMoZmFjdG9yX0Ffb3JkZXJlZCkpLAogICAgICAgICAgICAgeSA9IHJlb3JkZXIobGFiX0IsIGFzLm51bWVyaWMoZGVzYyhmYWN0b3JfQl9vcmRlcmVkKSkpLAogICAgICAgICAgICAgZmlsbCA9IGNvbmcpKSArIAogIGdlb21fdGlsZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gZm9ybWF0KHJvdW5kKGNvbmcsIDIpLCBuc21hbGwgPSAyKSwKICAgICAgICAgICAgICAgIGNvbG9yID0gY2FzZV93aGVuKGNvbmcgPiAwLjg1IH4gImEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmcgPiAwLjc1IH4gImIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZyA+IDAuNjUgfiAiYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gImQiKSksCiAgICAgICAgICAgIHNob3cubGVnZW5kID0gRikgKwogICMgYm9keS1saWtlIGZhY3RvcnMKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAwLjUsIHhtYXggPSAxMC41LCB5bWluID0gMjEuNSwgeW1heCA9IDMxLjUsCiAgICAgICAgICAgY29sb3IgPSBjb25nX3Bsb3RfY29sb3JzWzFdLCBzaXplID0gMS41LCBhbHBoYSA9IDApICsKICAjIG1pbmQtbGlrZSBmYWN0b3JzCiAgYW5ub3RhdGUoInJlY3QiLCB4bWluID0gMTcuNSwgeG1heCA9IDI3LjUsIHltaW4gPSA0LjUsIHltYXggPSAxNC41LAogICAgICAgICAgIGNvbG9yID0gY29uZ19wbG90X2NvbG9yc1syXSwgc2l6ZSA9IDEuNSwgYWxwaGEgPSAwKSArCiAgIyBoZWFydC1saWtlIGZhY3RvcnMKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAxMC41LCB4bWF4ID0gMTcuNSwgeW1pbiA9IDE0LjUsIHltYXggPSAyMS41LAogICAgICAgICAgIGNvbG9yID0gY29uZ19wbG90X2NvbG9yc1szXSwgc2l6ZSA9IDEuNSwgYWxwaGEgPSAwKSArCiAgIyBzY2FsZV9maWxsX3ZpcmlkaXNfYyh0cmFucyA9IHNjYWxlczo6ZXhwX3RyYW5zKGJhc2UgPSBleHAoMSkpLAogICMgICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhjb25nX2xvd2VyX2xpbSwgMSksIAogICMgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKGNvbmdfbG93ZXJfbGltLCAxLCAwLjA1KSwKICAjICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoZm9ybWF0KHNlcShjb25nX2xvd2VyX2xpbSwgMC44LCAwLjA1KSwgbnNtYWxsID0gMiksCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIwLjg1ID0gbW9kZXJhdGUiLCAiMC45MCIsIAogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMC45NSA9IGhpZ2giLCAiMS4wMCIpLAogICMgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uID0gInZpcmlkaXMiLAogICMgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihiYXJoZWlnaHQgPSA0MCkpICsKICBzY2FsZV9maWxsX2dyYWRpZW50bigjdHJhbnMgPSBzY2FsZXM6OmV4cF90cmFucyhiYXNlID0gZXhwKDEpKSwKICAgIGxpbWl0cyA9IGMoY29uZ19sb3dlcl9saW0sIDEpLCAKICAgIGJyZWFrcyA9IHNlcShjb25nX2xvd2VyX2xpbSwgMSwgMC4wNSksCiAgICBsYWJlbHMgPSBjKGZvcm1hdChzZXEoY29uZ19sb3dlcl9saW0sIDAuOCwgMC4wNSksIG5zbWFsbCA9IDIpLAogICAgICAgICAgICAgICAiMC44NSA9IG1vZGVyYXRlIiwgIjAuOTAiLCAKICAgICAgICAgICAgICAgIjAuOTUgPSBoaWdoIiwgIjEuMDAiKSwKICAgIGNvbG9ycyA9IHZpcmlkaXNMaXRlOjp2aXJpZGlzKDYpLAogICAgdmFsdWVzID0gYygwLCAwLjY1LCAwLjc1LCAwLjg1LCAwLjk1LCAxKSwKICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoYmFyaGVpZ2h0ID0gNDApKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImJsYWNrIiwgImJsYWNrIiwgImJsYWNrIiwgImdyYXk2MCIpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSgKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgICAjIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxLAogICAgICBhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMSwKICAgICAgc2l6ZSA9IHNpemVfZnVuKGNvbmdfYWxsX29yZGVyZWQkbGFiX0EsIHNpemVzID0gYygyMCwgMTQpKSwKICAgICAgY29sb3IgPSBjb2xvcl9mdW4oY29uZ19hbGxfb3JkZXJlZCRsYWJfQSwgY29sb3JfbGlzdCA9IGNvbmdfcGxvdF9jb2xvcnMpLAogICAgICBmYWNlICA9IGZhY2VfZnVuKGNvbmdfYWxsX29yZGVyZWQkbGFiX0EpKSwKICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gcmV2KHNpemVfZnVuKGNvbmdfYWxsX29yZGVyZWQkbGFiX0EsIHNpemVzID0gYygyMCwgMTQpKSksCiAgICAgIGNvbG9yID0gcmV2KGNvbG9yX2Z1bihjb25nX2FsbF9vcmRlcmVkJGxhYl9BLCBjb2xvcl9saXN0ID0gY29uZ19wbG90X2NvbG9ycykpLAogICAgICBmYWNlICA9IHJldihmYWNlX2Z1bihjb25nX2FsbF9vcmRlcmVkJGxhYl9BKSkpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAyMCksCiAgICAjIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuNSksCiAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2xpbmUoCiAgICAgIHNpemUgPSBzaXplX2Z1bihjb25nX2FsbF9vcmRlcmVkJGxhYl9BLCBzaXplcyA9IGMoMS41LCAwLjUpKSwKICAgICAgY29sb3IgPSBjb2xvcl9mdW4oY29uZ19hbGxfb3JkZXJlZCRsYWJfQSwgY29sb3JfbGlzdCA9IGNvbmdfcGxvdF9jb2xvcnMpKSwKICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfbGluZSgKICAgICAgc2l6ZSA9IHJldihzaXplX2Z1bihjb25nX2FsbF9vcmRlcmVkJGxhYl9BLCBzaXplcyA9IGMoMS41LCAwLjUpKSksCiAgICAgIGNvbG9yID0gcmV2KGNvbG9yX2Z1bihjb25nX2FsbF9vcmRlcmVkJGxhYl9BLCBjb2xvcl9saXN0ID0gY29uZ19wbG90X2NvbG9ycykpKSwKICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgwLjI1LCAiY20iKSkgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMLCBmaWxsID0gZXhwcmVzc2lvbihpdGFsaWMocltjXSkpKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnMDIucG5nIikKYGBgCgojIyBEZXZlbG9wbWVudGFsIGNvbXBhcmlzb25zCgpgYGB7ciBkZXYgY29tcCBhbGwgc2l0ZXMsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAxLjJ9CiMgRklHVVJFIFM1LCBGSUdVUkUgUzYsIEZJR1VSRSBTNywgRklHVVJFIFM4LCBGSUdVUkUgUzkKcGxvdF9ncmlkKGhlYXRtYXBfY29tcF9mdW4oZWZhX2xpc3QgPSBsaXN0KGVmYV91c19hZHVsdHMsIGVmYV91c19jaGlsZHJlbiksIHBhZGRpbmcgPSBGKSwKICAgICAgICAgIGRldl9jb25nX3Bsb3RfZnVuKGNvbmdfZGZfY2hpbGRyZW4sIHdoaWNoX2NvdW50cnkgPSAiVVMiLCBwYWRkaW5nID0gVCksCiAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDIsIDEuNSksIGxhYmVscyA9ICJBVVRPIikKZ2dzYXZlKCIuLi9maWd1cmVzL2ZpZ1MwNS5wbmciKQoKcGxvdF9ncmlkKGhlYXRtYXBfY29tcF9mdW4oZWZhX2xpc3QgPSBsaXN0KGVmYV9naF9hZHVsdHMsIGVmYV9naF9jaGlsZHJlbiksIHBhZGRpbmcgPSBGKSwKICAgICAgICAgIGRldl9jb25nX3Bsb3RfZnVuKGNvbmdfZGZfY2hpbGRyZW4sIHdoaWNoX2NvdW50cnkgPSAiR2hhbmEiLCBwYWRkaW5nID0gVCksCiAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDIsIDEuNSksIGxhYmVscyA9ICJBVVRPIikKZ2dzYXZlKCIuLi9maWd1cmVzL2ZpZ1MwNi5wbmciKQoKcGxvdF9ncmlkKGhlYXRtYXBfY29tcF9mdW4oZWZhX2xpc3QgPSBsaXN0KGVmYV90aF9hZHVsdHMsIGVmYV90aF9jaGlsZHJlbiksIHBhZGRpbmcgPSBGKSwKICAgICAgICAgIGRldl9jb25nX3Bsb3RfZnVuKGNvbmdfZGZfY2hpbGRyZW4sIHdoaWNoX2NvdW50cnkgPSAiVGhhaWxhbmQiLCBwYWRkaW5nID0gVCksCiAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDIsIDEuNSksIGxhYmVscyA9ICJBVVRPIikKZ2dzYXZlKCIuLi9maWd1cmVzL2ZpZ1MwNy5wbmciKQoKcGxvdF9ncmlkKGhlYXRtYXBfY29tcF9mdW4oZWZhX2xpc3QgPSBsaXN0KGVmYV9jaF9hZHVsdHMsIGVmYV9jaF9jaGlsZHJlbiksIHBhZGRpbmcgPSBGKSwKICAgICAgICAgIGRldl9jb25nX3Bsb3RfZnVuKGNvbmdfZGZfY2hpbGRyZW4sIHdoaWNoX2NvdW50cnkgPSAiQ2hpbmEiLCBwYWRkaW5nID0gVCksCiAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDIsIDEuNSksIGxhYmVscyA9ICJBVVRPIikKZ2dzYXZlKCIuLi9maWd1cmVzL2ZpZ1MwOC5wbmciKQoKcGxvdF9ncmlkKGhlYXRtYXBfY29tcF9mdW4oZWZhX2xpc3QgPSBsaXN0KGVmYV92dF9hZHVsdHMsIGVmYV92dF9jaGlsZHJlbiksIHBhZGRpbmcgPSBGKSwKICAgICAgICAgIGRldl9jb25nX3Bsb3RfZnVuKGNvbmdfZGZfY2hpbGRyZW4sIHdoaWNoX2NvdW50cnkgPSAiVmFudWF0dSIsIHBhZGRpbmcgPSBUKSwKICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMiwgMS41KSwgbGFiZWxzID0gIkFVVE8iKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnUzA5LnBuZyIpCmBgYAoKYGBge3IgbG9hZGluZ3MgYWxsIHNhbXBsZXMsIGZpZy53aWR0aCA9IDYuNSwgZmlnLmFzcCA9IDAuNn0KIyBGSUdVUkUgMQpoZWF0bWFwX2NvbXBfZnVuKGxpc3QoZWZhX3VzX2FkdWx0cywgZWZhX2doX2FkdWx0cywgZWZhX3RoX2FkdWx0cywgCiAgICAgICAgICAgICAgICAgICAgICBlZmFfY2hfYWR1bHRzLCBlZmFfdnRfYWR1bHRzLCAKICAgICAgICAgICAgICAgICAgICAgIGVmYV91c19jaGlsZHJlbiwgZWZhX2doX2NoaWxkcmVuLCBlZmFfdGhfY2hpbGRyZW4sIAogICAgICAgICAgICAgICAgICAgICAgZWZhX2NoX2NoaWxkcmVuLCBlZmFfdnRfY2hpbGRyZW4pLCAKICAgICAgICAgICAgICAgICBmYWNldF9vcmRlcl92YXJzID0gYygiYWdlX2dyb3VwIiwgImNvdW50cnkiLCAiZm51bSIpLAogICAgICAgICAgICAgICAgIGZhY2V0X2xhYl9zcGxpdCA9IFQpICsKICB0aGVtZShwYW5lbC5zcGFjaW5nLnggPSB1bml0KGMocmVwKDAuMiwgNCksIDEsIHJlcCgwLjI1LCA0KSksICJsaW5lIiksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsKICBndWlkZXMoZmlsbCA9IGd1aWRlX2NvbG9yYmFyKGJhcndpZHRoID0gMzAsIGJhcmhlaWdodCA9IDAuNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJGYWN0b3IgbG9hZGluZyIsIHRpdGxlLnZqdXN0ID0gMSkpCmdnc2F2ZSgiLi4vZmlndXJlcy9maWcwMS5wbmciKQpgYGAKCmBgYHtyIGRvbWluYW50IGZhY3RvciwgZmlnLndpZHRoID0gNi41LCBmaWcuYXNwID0gMC42LCBpbmNsdWRlID0gRn0KIyBoaWdobGlnaHRpbmcgZG9taW5hbnQgZmFjdG9yIChpZ25vcmluZyBjcm9zcy1sb2FkaW5ncyA+IDAuMDUpCmxvYWRpbmdzX2FsbCA8LSBsb2FkaW5nc19hZHVsdHMgJT4lCiAgc2VsZWN0KC1jb250YWlucygib3JkIikpICU+JQogIGZ1bGxfam9pbihsb2FkaW5nc19jaGlsZHJlbiAlPiUKICAgICAgICAgICAgICBzZWxlY3QoLWNvbnRhaW5zKCJvcmQiKSkpCgpkb21fZmFjdG9yc19hbGwgPC0gbG9hZGluZ3NfYWxsICU+JQogIGdyb3VwX2J5KGNvdW50cnksIGFnZV9ncm91cCwgY2FwYWNpdHkpICU+JSAKICB0b3BfbigxLCBhYnMobG9hZGluZykpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBzZWxlY3QoY291bnRyeSwgYWdlX2dyb3VwLCBjYXBhY2l0eSwgZmFjdG9yLCBsb2FkaW5nKSAlPiUKICByZW5hbWUoZG9tX2ZhY3RvciA9IGZhY3RvciwKICAgICAgICAgZG9tX2xvYWRpbmcgPSBsb2FkaW5nKQoKcmVjdF9kZiA8LSBsb2FkaW5nc19hbGwgJT4lCiAgZnVsbF9qb2luKGRvbV9mYWN0b3JzX2FsbCkgJT4lCiAgbXV0YXRlKGZudW0gPSBnc3ViKCIuKl9GIiwgIkYiLCBmYWN0b3IpKSAlPiUKICBzZWxlY3QoLXN0YXJ0c193aXRoKCJmYWN0b3IiKSkgJT4lCiAgc3ByZWFkKGZudW0sIGxvYWRpbmcpICU+JQogIG11dGF0ZShkaWZmMSA9IGFicyhkb21fbG9hZGluZykgLSBhYnMoRjEpLAogICAgICAgICBkaWZmMiA9IGFicyhkb21fbG9hZGluZykgLSBhYnMoRjIpLAogICAgICAgICBkaWZmMyA9IGFicyhkb21fbG9hZGluZykgLSBhYnMoRjMpLAogICAgICAgICBkaWZmNCA9IGFicyhkb21fbG9hZGluZykgLSBhYnMoRjQpKSAlPiUKICBzZWxlY3QoLWMoZG9tX2xvYWRpbmcsIHN0YXJ0c193aXRoKCJGIikpKSAlPiUKICBnYXRoZXIod2hpY2hfZGlmZiwgZGlmZiwgc3RhcnRzX3dpdGgoImRpZmYiKSkgJT4lCiAgZmlsdGVyKGRpZmYgIT0gMCwgIWlzLm5hKGRpZmYpKSAlPiUKICBncm91cF9ieShjb3VudHJ5LCBhZ2VfZ3JvdXAsIGNhcGFjaXR5KSAlPiUKICB0b3BfbigtMSwgZGlmZikgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZShhbnlfc21hbGwgPSBkaWZmIDwgMC4wNSkgJT4lCiAgcmVuYW1lKGZhY3RvciA9IGRvbV9mYWN0b3IpICU+JQogIGxlZnRfam9pbihmdWxsX2pvaW4oZmFjdG9yX25hbWVzX2FkdWx0cywgZmFjdG9yX25hbWVzX2NoaWxkcmVuKSkKCiMgYW5hbG9nIHRvIEZJR1VSRSAxCnRlbXBfY2FwX29yZGVyIDwtIGZhLnNvcnQoZWZhX3VzX2FkdWx0cykkbG9hZGluZ3NbXSAlPiUgcm93bmFtZXMoKSAlPiUgcmV2KCkKCmdncGxvdChyZWN0X2RmICU+JQogICAgICAgICBmaWx0ZXIoIWlzLm5hKGFueV9zbWFsbCkpICU+JQogICAgICAgICBtdXRhdGUoY2FwYWNpdHkgPSBmYWN0b3IoY2FwYWNpdHksIGxldmVscyA9IHRlbXBfY2FwX29yZGVyKSksCiAgICAgICBhZXMoeCA9IGZhY3Rvcl9sYWJkZXNjcmlwdCwgCiAgICAgICAgICAgeSA9IGNhcGFjaXR5LCAKICAgICAgICAgICBmaWxsID0gYW55X3NtYWxsKSkgKwogIGZhY2V0X2dyaWQofiBpbnRlcmFjdGlvbihjb3VudHJ5LCBhZ2VfZ3JvdXApLCBzcGFjZSA9ICJmcmVlIiwgc2NhbGVzID0gImZyZWUiKSArCiAgZ2VvbV90aWxlKCkgKwogIHRoZW1lKHBhbmVsLnNwYWNpbmcueCA9IHVuaXQoYyhyZXAoMC4yLCA0KSwgMSwgcmVwKDAuMjUsIDQpKSwgImxpbmUiKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpCiMgZ2dzYXZlKCIuLi9maWd1cmVzL2ZpZzAxdjIucG5nIikKYGBgCgo=